; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=cmov | FileCheck %s --check-prefix=X86 --check-prefix=X86-NOSSE
; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=X86 --check-prefix=X86-SSE2
; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefix=X64 --check-prefix=X64-SSE2
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx2 | FileCheck %s --check-prefix=X64 --check-prefix=X64-AVX2
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx | FileCheck %s --check-prefix=X64 --check-prefix=X64-AVX --check-prefix=X64-AVX1
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx2 | FileCheck %s --check-prefix=X64 --check-prefix=X64-AVX --check-prefix=X64-AVX2
; This tests codegen time inlining/optimization of memcmp
; rdar://6480398
; X64-SSE2-NEXT: setne %al
; X64-SSE2-NEXT: retq
;
-; X64-AVX2-LABEL: length16_eq:
-; X64-AVX2: # %bb.0:
-; X64-AVX2-NEXT: vmovdqu (%rdi), %xmm0
-; X64-AVX2-NEXT: vpcmpeqb (%rsi), %xmm0, %xmm0
-; X64-AVX2-NEXT: vpmovmskb %xmm0, %eax
-; X64-AVX2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
-; X64-AVX2-NEXT: setne %al
-; X64-AVX2-NEXT: retq
+; X64-AVX-LABEL: length16_eq:
+; X64-AVX: # %bb.0:
+; X64-AVX-NEXT: vmovdqu (%rdi), %xmm0
+; X64-AVX-NEXT: vpxor (%rsi), %xmm0, %xmm0
+; X64-AVX-NEXT: vptest %xmm0, %xmm0
+; X64-AVX-NEXT: setne %al
+; X64-AVX-NEXT: retq
%call = tail call i32 @memcmp(i8* %x, i8* %y, i64 16) nounwind
%cmp = icmp ne i32 %call, 0
ret i1 %cmp
; X64-SSE2-NEXT: sete %al
; X64-SSE2-NEXT: retq
;
-; X64-AVX2-LABEL: length16_eq_const:
-; X64-AVX2: # %bb.0:
-; X64-AVX2-NEXT: vmovdqu (%rdi), %xmm0
-; X64-AVX2-NEXT: vpcmpeqb {{.*}}(%rip), %xmm0, %xmm0
-; X64-AVX2-NEXT: vpmovmskb %xmm0, %eax
-; X64-AVX2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
-; X64-AVX2-NEXT: sete %al
-; X64-AVX2-NEXT: retq
+; X64-AVX-LABEL: length16_eq_const:
+; X64-AVX: # %bb.0:
+; X64-AVX-NEXT: vmovdqu (%rdi), %xmm0
+; X64-AVX-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0
+; X64-AVX-NEXT: vptest %xmm0, %xmm0
+; X64-AVX-NEXT: sete %al
+; X64-AVX-NEXT: retq
%m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([65 x i8], [65 x i8]* @.str, i32 0, i32 0), i64 16) nounwind
%c = icmp eq i32 %m, 0
ret i1 %c
; X64-SSE2-NEXT: sete %al
; X64-SSE2-NEXT: retq
;
-; X64-AVX2-LABEL: length24_eq:
-; X64-AVX2: # %bb.0:
-; X64-AVX2-NEXT: vmovdqu (%rdi), %xmm0
-; X64-AVX2-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero
-; X64-AVX2-NEXT: vmovq {{.*#+}} xmm2 = mem[0],zero
-; X64-AVX2-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm1
-; X64-AVX2-NEXT: vpcmpeqb (%rsi), %xmm0, %xmm0
-; X64-AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
-; X64-AVX2-NEXT: vpmovmskb %xmm0, %eax
-; X64-AVX2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
-; X64-AVX2-NEXT: sete %al
-; X64-AVX2-NEXT: retq
+; X64-AVX-LABEL: length24_eq:
+; X64-AVX: # %bb.0:
+; X64-AVX-NEXT: vmovdqu (%rdi), %xmm0
+; X64-AVX-NEXT: vmovq 16(%rdi), %xmm1
+; X64-AVX-NEXT: vmovq 16(%rsi), %xmm2
+; X64-AVX-NEXT: vpxor %xmm2, %xmm1, %xmm1
+; X64-AVX-NEXT: vpxor (%rsi), %xmm0, %xmm0
+; X64-AVX-NEXT: vpor %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT: vptest %xmm0, %xmm0
+; X64-AVX-NEXT: sete %al
+; X64-AVX-NEXT: retq
%call = tail call i32 @memcmp(i8* %x, i8* %y, i64 24) nounwind
%cmp = icmp eq i32 %call, 0
ret i1 %cmp
; X64-SSE2-NEXT: setne %al
; X64-SSE2-NEXT: retq
;
-; X64-AVX2-LABEL: length24_eq_const:
-; X64-AVX2: # %bb.0:
-; X64-AVX2-NEXT: vmovdqu (%rdi), %xmm0
-; X64-AVX2-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero
-; X64-AVX2-NEXT: vpcmpeqb {{.*}}(%rip), %xmm1, %xmm1
-; X64-AVX2-NEXT: vpcmpeqb {{.*}}(%rip), %xmm0, %xmm0
-; X64-AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
-; X64-AVX2-NEXT: vpmovmskb %xmm0, %eax
-; X64-AVX2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
-; X64-AVX2-NEXT: setne %al
-; X64-AVX2-NEXT: retq
+; X64-AVX-LABEL: length24_eq_const:
+; X64-AVX: # %bb.0:
+; X64-AVX-NEXT: vmovdqu (%rdi), %xmm0
+; X64-AVX-NEXT: vmovq 16(%rdi), %xmm1
+; X64-AVX-NEXT: vpxor {{.*}}(%rip), %xmm1, %xmm1
+; X64-AVX-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0
+; X64-AVX-NEXT: vpor %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT: vptest %xmm0, %xmm0
+; X64-AVX-NEXT: setne %al
+; X64-AVX-NEXT: retq
%m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([65 x i8], [65 x i8]* @.str, i32 0, i32 0), i64 24) nounwind
%c = icmp ne i32 %m, 0
ret i1 %c
; X64-SSE2-NEXT: sete %al
; X64-SSE2-NEXT: retq
;
+; X64-AVX1-LABEL: length32_eq:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vmovdqu (%rdi), %xmm0
+; X64-AVX1-NEXT: vmovdqu 16(%rdi), %xmm1
+; X64-AVX1-NEXT: vpxor 16(%rsi), %xmm1, %xmm1
+; X64-AVX1-NEXT: vpxor (%rsi), %xmm0, %xmm0
+; X64-AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vptest %xmm0, %xmm0
+; X64-AVX1-NEXT: sete %al
+; X64-AVX1-NEXT: retq
+;
; X64-AVX2-LABEL: length32_eq:
; X64-AVX2: # %bb.0:
; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0
-; X64-AVX2-NEXT: vpcmpeqb (%rsi), %ymm0, %ymm0
-; X64-AVX2-NEXT: vpmovmskb %ymm0, %eax
-; X64-AVX2-NEXT: cmpl $-1, %eax
+; X64-AVX2-NEXT: vpxor (%rsi), %ymm0, %ymm0
+; X64-AVX2-NEXT: vptest %ymm0, %ymm0
; X64-AVX2-NEXT: sete %al
; X64-AVX2-NEXT: vzeroupper
; X64-AVX2-NEXT: retq
; X64-SSE2-NEXT: setne %al
; X64-SSE2-NEXT: retq
;
+; X64-AVX1-LABEL: length32_eq_const:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vmovdqu (%rdi), %xmm0
+; X64-AVX1-NEXT: vmovdqu 16(%rdi), %xmm1
+; X64-AVX1-NEXT: vpxor {{.*}}(%rip), %xmm1, %xmm1
+; X64-AVX1-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0
+; X64-AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vptest %xmm0, %xmm0
+; X64-AVX1-NEXT: setne %al
+; X64-AVX1-NEXT: retq
+;
; X64-AVX2-LABEL: length32_eq_const:
; X64-AVX2: # %bb.0:
; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0
-; X64-AVX2-NEXT: vpcmpeqb {{.*}}(%rip), %ymm0, %ymm0
-; X64-AVX2-NEXT: vpmovmskb %ymm0, %eax
-; X64-AVX2-NEXT: cmpl $-1, %eax
+; X64-AVX2-NEXT: vpxor {{.*}}(%rip), %ymm0, %ymm0
+; X64-AVX2-NEXT: vptest %ymm0, %ymm0
; X64-AVX2-NEXT: setne %al
; X64-AVX2-NEXT: vzeroupper
; X64-AVX2-NEXT: retq
; X64-SSE2-NEXT: popq %rcx
; X64-SSE2-NEXT: retq
;
+; X64-AVX1-LABEL: length64_eq:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: pushq %rax
+; X64-AVX1-NEXT: movl $64, %edx
+; X64-AVX1-NEXT: callq memcmp
+; X64-AVX1-NEXT: testl %eax, %eax
+; X64-AVX1-NEXT: setne %al
+; X64-AVX1-NEXT: popq %rcx
+; X64-AVX1-NEXT: retq
+;
; X64-AVX2-LABEL: length64_eq:
; X64-AVX2: # %bb.0:
; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0
; X64-AVX2-NEXT: vmovdqu 32(%rdi), %ymm1
-; X64-AVX2-NEXT: vpcmpeqb 32(%rsi), %ymm1, %ymm1
-; X64-AVX2-NEXT: vpcmpeqb (%rsi), %ymm0, %ymm0
-; X64-AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
-; X64-AVX2-NEXT: vpmovmskb %ymm0, %eax
-; X64-AVX2-NEXT: cmpl $-1, %eax
+; X64-AVX2-NEXT: vpxor 32(%rsi), %ymm1, %ymm1
+; X64-AVX2-NEXT: vpxor (%rsi), %ymm0, %ymm0
+; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
+; X64-AVX2-NEXT: vptest %ymm0, %ymm0
; X64-AVX2-NEXT: setne %al
; X64-AVX2-NEXT: vzeroupper
; X64-AVX2-NEXT: retq
; X64-SSE2-NEXT: popq %rcx
; X64-SSE2-NEXT: retq
;
+; X64-AVX1-LABEL: length64_eq_const:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: pushq %rax
+; X64-AVX1-NEXT: movl $.L.str, %esi
+; X64-AVX1-NEXT: movl $64, %edx
+; X64-AVX1-NEXT: callq memcmp
+; X64-AVX1-NEXT: testl %eax, %eax
+; X64-AVX1-NEXT: sete %al
+; X64-AVX1-NEXT: popq %rcx
+; X64-AVX1-NEXT: retq
+;
; X64-AVX2-LABEL: length64_eq_const:
; X64-AVX2: # %bb.0:
; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0
; X64-AVX2-NEXT: vmovdqu 32(%rdi), %ymm1
-; X64-AVX2-NEXT: vpcmpeqb {{.*}}(%rip), %ymm1, %ymm1
-; X64-AVX2-NEXT: vpcmpeqb {{.*}}(%rip), %ymm0, %ymm0
-; X64-AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
-; X64-AVX2-NEXT: vpmovmskb %ymm0, %eax
-; X64-AVX2-NEXT: cmpl $-1, %eax
+; X64-AVX2-NEXT: vpxor {{.*}}(%rip), %ymm1, %ymm1
+; X64-AVX2-NEXT: vpxor {{.*}}(%rip), %ymm0, %ymm0
+; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
+; X64-AVX2-NEXT: vptest %ymm0, %ymm0
; X64-AVX2-NEXT: sete %al
; X64-AVX2-NEXT: vzeroupper
; X64-AVX2-NEXT: retq
; X64-AVX-LABEL: length16_eq:
; X64-AVX: # %bb.0:
; X64-AVX-NEXT: vmovdqu (%rdi), %xmm0
-; X64-AVX-NEXT: vpcmpeqb (%rsi), %xmm0, %xmm0
-; X64-AVX-NEXT: vpmovmskb %xmm0, %eax
-; X64-AVX-NEXT: cmpl $65535, %eax # imm = 0xFFFF
+; X64-AVX-NEXT: vpxor (%rsi), %xmm0, %xmm0
+; X64-AVX-NEXT: vptest %xmm0, %xmm0
; X64-AVX-NEXT: setne %al
; X64-AVX-NEXT: retq
%call = tail call i32 @memcmp(i8* %x, i8* %y, i64 16) nounwind
; X64-AVX-LABEL: length16_eq_const:
; X64-AVX: # %bb.0:
; X64-AVX-NEXT: vmovdqu (%rdi), %xmm0
-; X64-AVX-NEXT: vpcmpeqb {{.*}}(%rip), %xmm0, %xmm0
-; X64-AVX-NEXT: vpmovmskb %xmm0, %eax
-; X64-AVX-NEXT: cmpl $65535, %eax # imm = 0xFFFF
+; X64-AVX-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0
+; X64-AVX-NEXT: vptest %xmm0, %xmm0
; X64-AVX-NEXT: sete %al
; X64-AVX-NEXT: retq
%m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([65 x i8], [65 x i8]* @.str, i32 0, i32 0), i64 16) nounwind
; X64-AVX-LABEL: length24_eq:
; X64-AVX: # %bb.0:
; X64-AVX-NEXT: vmovdqu (%rdi), %xmm0
-; X64-AVX-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero
-; X64-AVX-NEXT: vmovq {{.*#+}} xmm2 = mem[0],zero
-; X64-AVX-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm1
-; X64-AVX-NEXT: vpcmpeqb (%rsi), %xmm0, %xmm0
-; X64-AVX-NEXT: vpand %xmm1, %xmm0, %xmm0
-; X64-AVX-NEXT: vpmovmskb %xmm0, %eax
-; X64-AVX-NEXT: cmpl $65535, %eax # imm = 0xFFFF
+; X64-AVX-NEXT: vmovq 16(%rdi), %xmm1
+; X64-AVX-NEXT: vmovq 16(%rsi), %xmm2
+; X64-AVX-NEXT: vpxor %xmm2, %xmm1, %xmm1
+; X64-AVX-NEXT: vpxor (%rsi), %xmm0, %xmm0
+; X64-AVX-NEXT: vpor %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT: vptest %xmm0, %xmm0
; X64-AVX-NEXT: sete %al
; X64-AVX-NEXT: retq
%call = tail call i32 @memcmp(i8* %x, i8* %y, i64 24) nounwind
; X64-AVX-LABEL: length24_eq_const:
; X64-AVX: # %bb.0:
; X64-AVX-NEXT: vmovdqu (%rdi), %xmm0
-; X64-AVX-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero
-; X64-AVX-NEXT: vpcmpeqb {{.*}}(%rip), %xmm1, %xmm1
-; X64-AVX-NEXT: vpcmpeqb {{.*}}(%rip), %xmm0, %xmm0
-; X64-AVX-NEXT: vpand %xmm1, %xmm0, %xmm0
-; X64-AVX-NEXT: vpmovmskb %xmm0, %eax
-; X64-AVX-NEXT: cmpl $65535, %eax # imm = 0xFFFF
+; X64-AVX-NEXT: vmovq 16(%rdi), %xmm1
+; X64-AVX-NEXT: vpxor {{.*}}(%rip), %xmm1, %xmm1
+; X64-AVX-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0
+; X64-AVX-NEXT: vpor %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT: vptest %xmm0, %xmm0
; X64-AVX-NEXT: setne %al
; X64-AVX-NEXT: retq
%m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([65 x i8], [65 x i8]* @.str, i32 0, i32 0), i64 24) nounwind
; X64-AVX1: # %bb.0:
; X64-AVX1-NEXT: vmovdqu (%rdi), %xmm0
; X64-AVX1-NEXT: vmovdqu 16(%rdi), %xmm1
-; X64-AVX1-NEXT: vpcmpeqb 16(%rsi), %xmm1, %xmm1
-; X64-AVX1-NEXT: vpcmpeqb (%rsi), %xmm0, %xmm0
-; X64-AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0
-; X64-AVX1-NEXT: vpmovmskb %xmm0, %eax
-; X64-AVX1-NEXT: cmpl $65535, %eax # imm = 0xFFFF
+; X64-AVX1-NEXT: vpxor 16(%rsi), %xmm1, %xmm1
+; X64-AVX1-NEXT: vpxor (%rsi), %xmm0, %xmm0
+; X64-AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vptest %xmm0, %xmm0
; X64-AVX1-NEXT: sete %al
; X64-AVX1-NEXT: retq
;
; X64-AVX2-LABEL: length32_eq:
; X64-AVX2: # %bb.0:
; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0
-; X64-AVX2-NEXT: vpcmpeqb (%rsi), %ymm0, %ymm0
-; X64-AVX2-NEXT: vpmovmskb %ymm0, %eax
-; X64-AVX2-NEXT: cmpl $-1, %eax
+; X64-AVX2-NEXT: vpxor (%rsi), %ymm0, %ymm0
+; X64-AVX2-NEXT: vptest %ymm0, %ymm0
; X64-AVX2-NEXT: sete %al
; X64-AVX2-NEXT: vzeroupper
; X64-AVX2-NEXT: retq
; X64-AVX: # %bb.0:
; X64-AVX-NEXT: vmovdqu (%rdi), %xmm0
; X64-AVX-NEXT: vmovdqu 16(%rdi), %xmm1
-; X64-AVX-NEXT: vpcmpeqb 16(%rsi), %xmm1, %xmm1
-; X64-AVX-NEXT: vpcmpeqb (%rsi), %xmm0, %xmm0
-; X64-AVX-NEXT: vpand %xmm1, %xmm0, %xmm0
-; X64-AVX-NEXT: vpmovmskb %xmm0, %eax
-; X64-AVX-NEXT: cmpl $65535, %eax # imm = 0xFFFF
+; X64-AVX-NEXT: vpxor 16(%rsi), %xmm1, %xmm1
+; X64-AVX-NEXT: vpxor (%rsi), %xmm0, %xmm0
+; X64-AVX-NEXT: vpor %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT: vptest %xmm0, %xmm0
; X64-AVX-NEXT: sete %al
; X64-AVX-NEXT: retq
%call = tail call i32 @memcmp(i8* %x, i8* %y, i64 32) nounwind
; X64-AVX1: # %bb.0:
; X64-AVX1-NEXT: vmovdqu (%rdi), %xmm0
; X64-AVX1-NEXT: vmovdqu 16(%rdi), %xmm1
-; X64-AVX1-NEXT: vpcmpeqb {{.*}}(%rip), %xmm1, %xmm1
-; X64-AVX1-NEXT: vpcmpeqb {{.*}}(%rip), %xmm0, %xmm0
-; X64-AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0
-; X64-AVX1-NEXT: vpmovmskb %xmm0, %eax
-; X64-AVX1-NEXT: cmpl $65535, %eax # imm = 0xFFFF
+; X64-AVX1-NEXT: vpxor {{.*}}(%rip), %xmm1, %xmm1
+; X64-AVX1-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0
+; X64-AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vptest %xmm0, %xmm0
; X64-AVX1-NEXT: setne %al
; X64-AVX1-NEXT: retq
;
; X64-AVX2-LABEL: length32_eq_const:
; X64-AVX2: # %bb.0:
; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0
-; X64-AVX2-NEXT: vpcmpeqb {{.*}}(%rip), %ymm0, %ymm0
-; X64-AVX2-NEXT: vpmovmskb %ymm0, %eax
-; X64-AVX2-NEXT: cmpl $-1, %eax
+; X64-AVX2-NEXT: vpxor {{.*}}(%rip), %ymm0, %ymm0
+; X64-AVX2-NEXT: vptest %ymm0, %ymm0
; X64-AVX2-NEXT: setne %al
; X64-AVX2-NEXT: vzeroupper
; X64-AVX2-NEXT: retq
; X64-AVX2: # %bb.0:
; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0
; X64-AVX2-NEXT: vmovdqu 32(%rdi), %ymm1
-; X64-AVX2-NEXT: vpcmpeqb 32(%rsi), %ymm1, %ymm1
-; X64-AVX2-NEXT: vpcmpeqb (%rsi), %ymm0, %ymm0
-; X64-AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
-; X64-AVX2-NEXT: vpmovmskb %ymm0, %eax
-; X64-AVX2-NEXT: cmpl $-1, %eax
+; X64-AVX2-NEXT: vpxor 32(%rsi), %ymm1, %ymm1
+; X64-AVX2-NEXT: vpxor (%rsi), %ymm0, %ymm0
+; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
+; X64-AVX2-NEXT: vptest %ymm0, %ymm0
; X64-AVX2-NEXT: setne %al
; X64-AVX2-NEXT: vzeroupper
; X64-AVX2-NEXT: retq
; X64-AVX2: # %bb.0:
; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0
; X64-AVX2-NEXT: vmovdqu 32(%rdi), %ymm1
-; X64-AVX2-NEXT: vpcmpeqb {{.*}}(%rip), %ymm1, %ymm1
-; X64-AVX2-NEXT: vpcmpeqb {{.*}}(%rip), %ymm0, %ymm0
-; X64-AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
-; X64-AVX2-NEXT: vpmovmskb %ymm0, %eax
-; X64-AVX2-NEXT: cmpl $-1, %eax
+; X64-AVX2-NEXT: vpxor {{.*}}(%rip), %ymm1, %ymm1
+; X64-AVX2-NEXT: vpxor {{.*}}(%rip), %ymm0, %ymm0
+; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
+; X64-AVX2-NEXT: vptest %ymm0, %ymm0
; X64-AVX2-NEXT: sete %al
; X64-AVX2-NEXT: vzeroupper
; X64-AVX2-NEXT: retq
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=sse2 | FileCheck %s --check-prefix=ANY --check-prefix=NO512 --check-prefix=SSE2
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=sse4.1 | FileCheck %s --check-prefix=ANY --check-prefix=NO512 --check-prefix=SSE41
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx | FileCheck %s --check-prefix=ANY --check-prefix=NO512 --check-prefix=AVXANY --check-prefix=AVX1
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx2 | FileCheck %s --check-prefix=ANY --check-prefix=NO512 --check-prefix=AVXANY --check-prefix=AVX256 --check-prefix=AVX2
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512f | FileCheck %s --check-prefix=ANY --check-prefix=AVXANY --check-prefix=AVX256 --check-prefix=AVX512 --check-prefix=AVX512F
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512bw | FileCheck %s --check-prefix=ANY --check-prefix=AVXANY --check-prefix=AVX256 --check-prefix=AVX512 --check-prefix=AVX512BW
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx2 | FileCheck %s --check-prefix=ANY --check-prefix=NO512 --check-prefix=AVXANY --check-prefix=AVX2
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512f | FileCheck %s --check-prefix=ANY --check-prefix=AVXANY --check-prefix=AVX512 --check-prefix=AVX512F
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512bw | FileCheck %s --check-prefix=ANY --check-prefix=AVXANY --check-prefix=AVX512 --check-prefix=AVX512BW
; Equality checks of 128/256-bit values can use PMOVMSK or PTEST to avoid scalarization.
; SSE2-NEXT: setne %al
; SSE2-NEXT: retq
;
+; SSE41-LABEL: ne_i128:
+; SSE41: # %bb.0:
+; SSE41-NEXT: pxor %xmm1, %xmm0
+; SSE41-NEXT: xorl %eax, %eax
+; SSE41-NEXT: ptest %xmm0, %xmm0
+; SSE41-NEXT: setne %al
+; SSE41-NEXT: retq
+;
; AVXANY-LABEL: ne_i128:
; AVXANY: # %bb.0:
-; AVXANY-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0
-; AVXANY-NEXT: vpmovmskb %xmm0, %ecx
+; AVXANY-NEXT: vpxor %xmm1, %xmm0, %xmm0
; AVXANY-NEXT: xorl %eax, %eax
-; AVXANY-NEXT: cmpl $65535, %ecx # imm = 0xFFFF
+; AVXANY-NEXT: vptest %xmm0, %xmm0
; AVXANY-NEXT: setne %al
; AVXANY-NEXT: retq
%bcx = bitcast <2 x i64> %x to i128
; SSE2-NEXT: sete %al
; SSE2-NEXT: retq
;
+; SSE41-LABEL: eq_i128:
+; SSE41: # %bb.0:
+; SSE41-NEXT: pxor %xmm1, %xmm0
+; SSE41-NEXT: xorl %eax, %eax
+; SSE41-NEXT: ptest %xmm0, %xmm0
+; SSE41-NEXT: sete %al
+; SSE41-NEXT: retq
+;
; AVXANY-LABEL: eq_i128:
; AVXANY: # %bb.0:
-; AVXANY-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0
-; AVXANY-NEXT: vpmovmskb %xmm0, %ecx
+; AVXANY-NEXT: vpxor %xmm1, %xmm0, %xmm0
; AVXANY-NEXT: xorl %eax, %eax
-; AVXANY-NEXT: cmpl $65535, %ecx # imm = 0xFFFF
+; AVXANY-NEXT: vptest %xmm0, %xmm0
; AVXANY-NEXT: sete %al
; AVXANY-NEXT: retq
%bcx = bitcast <2 x i64> %x to i128
; SSE2-NEXT: setne %al
; SSE2-NEXT: retq
;
+; SSE41-LABEL: ne_i256:
+; SSE41: # %bb.0:
+; SSE41-NEXT: movq %xmm0, %rax
+; SSE41-NEXT: movq %xmm1, %rcx
+; SSE41-NEXT: pextrq $1, %xmm0, %rdx
+; SSE41-NEXT: pextrq $1, %xmm1, %r8
+; SSE41-NEXT: movq %xmm2, %rdi
+; SSE41-NEXT: xorq %rax, %rdi
+; SSE41-NEXT: movq %xmm3, %rsi
+; SSE41-NEXT: xorq %rcx, %rsi
+; SSE41-NEXT: orq %rdi, %rsi
+; SSE41-NEXT: pextrq $1, %xmm2, %rax
+; SSE41-NEXT: xorq %rdx, %rax
+; SSE41-NEXT: pextrq $1, %xmm3, %rcx
+; SSE41-NEXT: xorq %r8, %rcx
+; SSE41-NEXT: orq %rax, %rcx
+; SSE41-NEXT: xorl %eax, %eax
+; SSE41-NEXT: orq %rsi, %rcx
+; SSE41-NEXT: setne %al
+; SSE41-NEXT: retq
+;
; AVX1-LABEL: ne_i256:
; AVX1: # %bb.0:
-; AVX1-NEXT: vmovq %xmm0, %rax
-; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
-; AVX1-NEXT: vmovq %xmm2, %rcx
-; AVX1-NEXT: vpextrq $1, %xmm0, %rdx
-; AVX1-NEXT: vpextrq $1, %xmm2, %r8
-; AVX1-NEXT: vmovq %xmm1, %rdi
-; AVX1-NEXT: xorq %rax, %rdi
-; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm0
-; AVX1-NEXT: vmovq %xmm0, %rsi
-; AVX1-NEXT: xorq %rcx, %rsi
-; AVX1-NEXT: orq %rdi, %rsi
-; AVX1-NEXT: vpextrq $1, %xmm1, %rax
-; AVX1-NEXT: xorq %rdx, %rax
-; AVX1-NEXT: vpextrq $1, %xmm0, %rcx
-; AVX1-NEXT: xorq %r8, %rcx
-; AVX1-NEXT: orq %rax, %rcx
+; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0
; AVX1-NEXT: xorl %eax, %eax
-; AVX1-NEXT: orq %rsi, %rcx
+; AVX1-NEXT: vptest %ymm0, %ymm0
; AVX1-NEXT: setne %al
; AVX1-NEXT: vzeroupper
; AVX1-NEXT: retq
;
-; AVX256-LABEL: ne_i256:
-; AVX256: # %bb.0:
-; AVX256-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm0
-; AVX256-NEXT: vpmovmskb %ymm0, %ecx
-; AVX256-NEXT: xorl %eax, %eax
-; AVX256-NEXT: cmpl $-1, %ecx
-; AVX256-NEXT: setne %al
-; AVX256-NEXT: vzeroupper
-; AVX256-NEXT: retq
+; AVX2-LABEL: ne_i256:
+; AVX2: # %bb.0:
+; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
+; AVX2-NEXT: xorl %eax, %eax
+; AVX2-NEXT: vptest %ymm0, %ymm0
+; AVX2-NEXT: setne %al
+; AVX2-NEXT: vzeroupper
+; AVX2-NEXT: retq
+;
+; AVX512-LABEL: ne_i256:
+; AVX512: # %bb.0:
+; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm0
+; AVX512-NEXT: xorl %eax, %eax
+; AVX512-NEXT: vptest %ymm0, %ymm0
+; AVX512-NEXT: setne %al
+; AVX512-NEXT: vzeroupper
+; AVX512-NEXT: retq
%bcx = bitcast <4 x i64> %x to i256
%bcy = bitcast <4 x i64> %y to i256
%cmp = icmp ne i256 %bcx, %bcy
; SSE2-NEXT: sete %al
; SSE2-NEXT: retq
;
+; SSE41-LABEL: eq_i256:
+; SSE41: # %bb.0:
+; SSE41-NEXT: movq %xmm0, %rax
+; SSE41-NEXT: movq %xmm1, %rcx
+; SSE41-NEXT: pextrq $1, %xmm0, %rdx
+; SSE41-NEXT: pextrq $1, %xmm1, %r8
+; SSE41-NEXT: movq %xmm2, %rdi
+; SSE41-NEXT: xorq %rax, %rdi
+; SSE41-NEXT: movq %xmm3, %rsi
+; SSE41-NEXT: xorq %rcx, %rsi
+; SSE41-NEXT: orq %rdi, %rsi
+; SSE41-NEXT: pextrq $1, %xmm2, %rax
+; SSE41-NEXT: xorq %rdx, %rax
+; SSE41-NEXT: pextrq $1, %xmm3, %rcx
+; SSE41-NEXT: xorq %r8, %rcx
+; SSE41-NEXT: orq %rax, %rcx
+; SSE41-NEXT: xorl %eax, %eax
+; SSE41-NEXT: orq %rsi, %rcx
+; SSE41-NEXT: sete %al
+; SSE41-NEXT: retq
+;
; AVX1-LABEL: eq_i256:
; AVX1: # %bb.0:
-; AVX1-NEXT: vmovq %xmm0, %rax
-; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
-; AVX1-NEXT: vmovq %xmm2, %rcx
-; AVX1-NEXT: vpextrq $1, %xmm0, %rdx
-; AVX1-NEXT: vpextrq $1, %xmm2, %r8
-; AVX1-NEXT: vmovq %xmm1, %rdi
-; AVX1-NEXT: xorq %rax, %rdi
-; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm0
-; AVX1-NEXT: vmovq %xmm0, %rsi
-; AVX1-NEXT: xorq %rcx, %rsi
-; AVX1-NEXT: orq %rdi, %rsi
-; AVX1-NEXT: vpextrq $1, %xmm1, %rax
-; AVX1-NEXT: xorq %rdx, %rax
-; AVX1-NEXT: vpextrq $1, %xmm0, %rcx
-; AVX1-NEXT: xorq %r8, %rcx
-; AVX1-NEXT: orq %rax, %rcx
+; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0
; AVX1-NEXT: xorl %eax, %eax
-; AVX1-NEXT: orq %rsi, %rcx
+; AVX1-NEXT: vptest %ymm0, %ymm0
; AVX1-NEXT: sete %al
; AVX1-NEXT: vzeroupper
; AVX1-NEXT: retq
;
-; AVX256-LABEL: eq_i256:
-; AVX256: # %bb.0:
-; AVX256-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm0
-; AVX256-NEXT: vpmovmskb %ymm0, %ecx
-; AVX256-NEXT: xorl %eax, %eax
-; AVX256-NEXT: cmpl $-1, %ecx
-; AVX256-NEXT: sete %al
-; AVX256-NEXT: vzeroupper
-; AVX256-NEXT: retq
+; AVX2-LABEL: eq_i256:
+; AVX2: # %bb.0:
+; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
+; AVX2-NEXT: xorl %eax, %eax
+; AVX2-NEXT: vptest %ymm0, %ymm0
+; AVX2-NEXT: sete %al
+; AVX2-NEXT: vzeroupper
+; AVX2-NEXT: retq
+;
+; AVX512-LABEL: eq_i256:
+; AVX512: # %bb.0:
+; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm0
+; AVX512-NEXT: xorl %eax, %eax
+; AVX512-NEXT: vptest %ymm0, %ymm0
+; AVX512-NEXT: sete %al
+; AVX512-NEXT: vzeroupper
+; AVX512-NEXT: retq
%bcx = bitcast <4 x i64> %x to i256
%bcy = bitcast <4 x i64> %y to i256
%cmp = icmp eq i256 %bcx, %bcy
; SSE2-NEXT: setne %al
; SSE2-NEXT: retq
;
+; SSE41-LABEL: ne_i512:
+; SSE41: # %bb.0:
+; SSE41-NEXT: movq %xmm0, %rax
+; SSE41-NEXT: movq %xmm2, %rcx
+; SSE41-NEXT: movq %xmm1, %rdx
+; SSE41-NEXT: movq %xmm3, %rsi
+; SSE41-NEXT: pextrq $1, %xmm0, %r11
+; SSE41-NEXT: pextrq $1, %xmm2, %r8
+; SSE41-NEXT: pextrq $1, %xmm1, %r9
+; SSE41-NEXT: pextrq $1, %xmm3, %r10
+; SSE41-NEXT: movq %xmm4, %rdi
+; SSE41-NEXT: xorq %rax, %rdi
+; SSE41-NEXT: movq %xmm6, %rax
+; SSE41-NEXT: xorq %rcx, %rax
+; SSE41-NEXT: movq %xmm5, %rcx
+; SSE41-NEXT: xorq %rdx, %rcx
+; SSE41-NEXT: movq %xmm7, %rdx
+; SSE41-NEXT: xorq %rsi, %rdx
+; SSE41-NEXT: orq %rcx, %rdx
+; SSE41-NEXT: orq %rax, %rdx
+; SSE41-NEXT: orq %rdi, %rdx
+; SSE41-NEXT: pextrq $1, %xmm4, %rax
+; SSE41-NEXT: xorq %r11, %rax
+; SSE41-NEXT: pextrq $1, %xmm6, %rcx
+; SSE41-NEXT: xorq %r8, %rcx
+; SSE41-NEXT: pextrq $1, %xmm5, %rsi
+; SSE41-NEXT: xorq %r9, %rsi
+; SSE41-NEXT: pextrq $1, %xmm7, %rdi
+; SSE41-NEXT: xorq %r10, %rdi
+; SSE41-NEXT: orq %rsi, %rdi
+; SSE41-NEXT: orq %rcx, %rdi
+; SSE41-NEXT: orq %rax, %rdi
+; SSE41-NEXT: xorl %eax, %eax
+; SSE41-NEXT: orq %rdx, %rdi
+; SSE41-NEXT: setne %al
+; SSE41-NEXT: retq
+;
; AVX1-LABEL: ne_i512:
; AVX1: # %bb.0:
; AVX1-NEXT: vmovq %xmm0, %rax
; SSE2-NEXT: sete %al
; SSE2-NEXT: retq
;
+; SSE41-LABEL: eq_i512:
+; SSE41: # %bb.0:
+; SSE41-NEXT: movq %xmm0, %rax
+; SSE41-NEXT: movq %xmm2, %rcx
+; SSE41-NEXT: movq %xmm1, %rdx
+; SSE41-NEXT: movq %xmm3, %rsi
+; SSE41-NEXT: pextrq $1, %xmm0, %r11
+; SSE41-NEXT: pextrq $1, %xmm2, %r8
+; SSE41-NEXT: pextrq $1, %xmm1, %r9
+; SSE41-NEXT: pextrq $1, %xmm3, %r10
+; SSE41-NEXT: movq %xmm4, %rdi
+; SSE41-NEXT: xorq %rax, %rdi
+; SSE41-NEXT: movq %xmm6, %rax
+; SSE41-NEXT: xorq %rcx, %rax
+; SSE41-NEXT: movq %xmm5, %rcx
+; SSE41-NEXT: xorq %rdx, %rcx
+; SSE41-NEXT: movq %xmm7, %rdx
+; SSE41-NEXT: xorq %rsi, %rdx
+; SSE41-NEXT: orq %rcx, %rdx
+; SSE41-NEXT: orq %rax, %rdx
+; SSE41-NEXT: orq %rdi, %rdx
+; SSE41-NEXT: pextrq $1, %xmm4, %rax
+; SSE41-NEXT: xorq %r11, %rax
+; SSE41-NEXT: pextrq $1, %xmm6, %rcx
+; SSE41-NEXT: xorq %r8, %rcx
+; SSE41-NEXT: pextrq $1, %xmm5, %rsi
+; SSE41-NEXT: xorq %r9, %rsi
+; SSE41-NEXT: pextrq $1, %xmm7, %rdi
+; SSE41-NEXT: xorq %r10, %rdi
+; SSE41-NEXT: orq %rsi, %rdi
+; SSE41-NEXT: orq %rcx, %rdi
+; SSE41-NEXT: orq %rax, %rdi
+; SSE41-NEXT: xorl %eax, %eax
+; SSE41-NEXT: orq %rdx, %rdi
+; SSE41-NEXT: sete %al
+; SSE41-NEXT: retq
+;
; AVX1-LABEL: eq_i512:
; AVX1: # %bb.0:
; AVX1-NEXT: vmovq %xmm0, %rax
; SSE2-NEXT: setne %al
; SSE2-NEXT: retq
;
+; SSE41-LABEL: ne_i128_pair:
+; SSE41: # %bb.0:
+; SSE41-NEXT: movdqu (%rdi), %xmm0
+; SSE41-NEXT: movdqu 16(%rdi), %xmm1
+; SSE41-NEXT: movdqu (%rsi), %xmm2
+; SSE41-NEXT: pxor %xmm0, %xmm2
+; SSE41-NEXT: movdqu 16(%rsi), %xmm0
+; SSE41-NEXT: pxor %xmm1, %xmm0
+; SSE41-NEXT: por %xmm2, %xmm0
+; SSE41-NEXT: xorl %eax, %eax
+; SSE41-NEXT: ptest %xmm0, %xmm0
+; SSE41-NEXT: setne %al
+; SSE41-NEXT: retq
+;
; AVXANY-LABEL: ne_i128_pair:
; AVXANY: # %bb.0:
; AVXANY-NEXT: vmovdqu (%rdi), %xmm0
; AVXANY-NEXT: vmovdqu 16(%rdi), %xmm1
-; AVXANY-NEXT: vpcmpeqb 16(%rsi), %xmm1, %xmm1
-; AVXANY-NEXT: vpcmpeqb (%rsi), %xmm0, %xmm0
-; AVXANY-NEXT: vpand %xmm1, %xmm0, %xmm0
-; AVXANY-NEXT: vpmovmskb %xmm0, %ecx
+; AVXANY-NEXT: vpxor 16(%rsi), %xmm1, %xmm1
+; AVXANY-NEXT: vpxor (%rsi), %xmm0, %xmm0
+; AVXANY-NEXT: vpor %xmm1, %xmm0, %xmm0
; AVXANY-NEXT: xorl %eax, %eax
-; AVXANY-NEXT: cmpl $65535, %ecx # imm = 0xFFFF
+; AVXANY-NEXT: vptest %xmm0, %xmm0
; AVXANY-NEXT: setne %al
; AVXANY-NEXT: retq
%a0 = load i128, i128* %a
; SSE2-NEXT: sete %al
; SSE2-NEXT: retq
;
+; SSE41-LABEL: eq_i128_pair:
+; SSE41: # %bb.0:
+; SSE41-NEXT: movdqu (%rdi), %xmm0
+; SSE41-NEXT: movdqu 16(%rdi), %xmm1
+; SSE41-NEXT: movdqu (%rsi), %xmm2
+; SSE41-NEXT: pxor %xmm0, %xmm2
+; SSE41-NEXT: movdqu 16(%rsi), %xmm0
+; SSE41-NEXT: pxor %xmm1, %xmm0
+; SSE41-NEXT: por %xmm2, %xmm0
+; SSE41-NEXT: xorl %eax, %eax
+; SSE41-NEXT: ptest %xmm0, %xmm0
+; SSE41-NEXT: sete %al
+; SSE41-NEXT: retq
+;
; AVXANY-LABEL: eq_i128_pair:
; AVXANY: # %bb.0:
; AVXANY-NEXT: vmovdqu (%rdi), %xmm0
; AVXANY-NEXT: vmovdqu 16(%rdi), %xmm1
-; AVXANY-NEXT: vpcmpeqb 16(%rsi), %xmm1, %xmm1
-; AVXANY-NEXT: vpcmpeqb (%rsi), %xmm0, %xmm0
-; AVXANY-NEXT: vpand %xmm1, %xmm0, %xmm0
-; AVXANY-NEXT: vpmovmskb %xmm0, %ecx
+; AVXANY-NEXT: vpxor 16(%rsi), %xmm1, %xmm1
+; AVXANY-NEXT: vpxor (%rsi), %xmm0, %xmm0
+; AVXANY-NEXT: vpor %xmm1, %xmm0, %xmm0
; AVXANY-NEXT: xorl %eax, %eax
-; AVXANY-NEXT: cmpl $65535, %ecx # imm = 0xFFFF
+; AVXANY-NEXT: vptest %xmm0, %xmm0
; AVXANY-NEXT: sete %al
; AVXANY-NEXT: retq
%a0 = load i128, i128* %a
; SSE2-NEXT: setne %al
; SSE2-NEXT: retq
;
+; SSE41-LABEL: ne_i256_pair:
+; SSE41: # %bb.0:
+; SSE41-NEXT: movq 16(%rdi), %r9
+; SSE41-NEXT: movq 24(%rdi), %r11
+; SSE41-NEXT: movq (%rdi), %r8
+; SSE41-NEXT: movq 8(%rdi), %r10
+; SSE41-NEXT: xorq 8(%rsi), %r10
+; SSE41-NEXT: xorq 24(%rsi), %r11
+; SSE41-NEXT: xorq (%rsi), %r8
+; SSE41-NEXT: xorq 16(%rsi), %r9
+; SSE41-NEXT: movq 48(%rdi), %rdx
+; SSE41-NEXT: movq 32(%rdi), %rax
+; SSE41-NEXT: movq 56(%rdi), %rcx
+; SSE41-NEXT: movq 40(%rdi), %rdi
+; SSE41-NEXT: xorq 40(%rsi), %rdi
+; SSE41-NEXT: xorq 56(%rsi), %rcx
+; SSE41-NEXT: orq %r11, %rcx
+; SSE41-NEXT: orq %rdi, %rcx
+; SSE41-NEXT: orq %r10, %rcx
+; SSE41-NEXT: xorq 32(%rsi), %rax
+; SSE41-NEXT: xorq 48(%rsi), %rdx
+; SSE41-NEXT: orq %r9, %rdx
+; SSE41-NEXT: orq %rax, %rdx
+; SSE41-NEXT: orq %r8, %rdx
+; SSE41-NEXT: xorl %eax, %eax
+; SSE41-NEXT: orq %rcx, %rdx
+; SSE41-NEXT: setne %al
+; SSE41-NEXT: retq
+;
; AVX1-LABEL: ne_i256_pair:
; AVX1: # %bb.0:
-; AVX1-NEXT: movq 16(%rdi), %r9
-; AVX1-NEXT: movq 24(%rdi), %r11
-; AVX1-NEXT: movq (%rdi), %r8
-; AVX1-NEXT: movq 8(%rdi), %r10
-; AVX1-NEXT: xorq 8(%rsi), %r10
-; AVX1-NEXT: xorq 24(%rsi), %r11
-; AVX1-NEXT: xorq (%rsi), %r8
-; AVX1-NEXT: xorq 16(%rsi), %r9
-; AVX1-NEXT: movq 48(%rdi), %rdx
-; AVX1-NEXT: movq 32(%rdi), %rax
-; AVX1-NEXT: movq 56(%rdi), %rcx
-; AVX1-NEXT: movq 40(%rdi), %rdi
-; AVX1-NEXT: xorq 40(%rsi), %rdi
-; AVX1-NEXT: xorq 56(%rsi), %rcx
-; AVX1-NEXT: orq %r11, %rcx
-; AVX1-NEXT: orq %rdi, %rcx
-; AVX1-NEXT: orq %r10, %rcx
-; AVX1-NEXT: xorq 32(%rsi), %rax
-; AVX1-NEXT: xorq 48(%rsi), %rdx
-; AVX1-NEXT: orq %r9, %rdx
-; AVX1-NEXT: orq %rax, %rdx
-; AVX1-NEXT: orq %r8, %rdx
+; AVX1-NEXT: vmovups (%rdi), %ymm0
+; AVX1-NEXT: vmovups 32(%rdi), %ymm1
+; AVX1-NEXT: vxorps 32(%rsi), %ymm1, %ymm1
+; AVX1-NEXT: vxorps (%rsi), %ymm0, %ymm0
+; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
; AVX1-NEXT: xorl %eax, %eax
-; AVX1-NEXT: orq %rcx, %rdx
+; AVX1-NEXT: vptest %ymm0, %ymm0
; AVX1-NEXT: setne %al
+; AVX1-NEXT: vzeroupper
; AVX1-NEXT: retq
;
-; AVX256-LABEL: ne_i256_pair:
-; AVX256: # %bb.0:
-; AVX256-NEXT: vmovdqu (%rdi), %ymm0
-; AVX256-NEXT: vmovdqu 32(%rdi), %ymm1
-; AVX256-NEXT: vpcmpeqb 32(%rsi), %ymm1, %ymm1
-; AVX256-NEXT: vpcmpeqb (%rsi), %ymm0, %ymm0
-; AVX256-NEXT: vpand %ymm1, %ymm0, %ymm0
-; AVX256-NEXT: vpmovmskb %ymm0, %ecx
-; AVX256-NEXT: xorl %eax, %eax
-; AVX256-NEXT: cmpl $-1, %ecx
-; AVX256-NEXT: setne %al
-; AVX256-NEXT: vzeroupper
-; AVX256-NEXT: retq
+; AVX2-LABEL: ne_i256_pair:
+; AVX2: # %bb.0:
+; AVX2-NEXT: vmovdqu (%rdi), %ymm0
+; AVX2-NEXT: vmovdqu 32(%rdi), %ymm1
+; AVX2-NEXT: vpxor 32(%rsi), %ymm1, %ymm1
+; AVX2-NEXT: vpxor (%rsi), %ymm0, %ymm0
+; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
+; AVX2-NEXT: xorl %eax, %eax
+; AVX2-NEXT: vptest %ymm0, %ymm0
+; AVX2-NEXT: setne %al
+; AVX2-NEXT: vzeroupper
+; AVX2-NEXT: retq
+;
+; AVX512-LABEL: ne_i256_pair:
+; AVX512: # %bb.0:
+; AVX512-NEXT: vmovdqu (%rdi), %ymm0
+; AVX512-NEXT: vmovdqu 32(%rdi), %ymm1
+; AVX512-NEXT: vpxor 32(%rsi), %ymm1, %ymm1
+; AVX512-NEXT: vpxor (%rsi), %ymm0, %ymm0
+; AVX512-NEXT: vpor %ymm1, %ymm0, %ymm0
+; AVX512-NEXT: xorl %eax, %eax
+; AVX512-NEXT: vptest %ymm0, %ymm0
+; AVX512-NEXT: setne %al
+; AVX512-NEXT: vzeroupper
+; AVX512-NEXT: retq
%a0 = load i256, i256* %a
%b0 = load i256, i256* %b
%xor1 = xor i256 %a0, %b0
; SSE2-NEXT: sete %al
; SSE2-NEXT: retq
;
+; SSE41-LABEL: eq_i256_pair:
+; SSE41: # %bb.0:
+; SSE41-NEXT: movq 16(%rdi), %r9
+; SSE41-NEXT: movq 24(%rdi), %r11
+; SSE41-NEXT: movq (%rdi), %r8
+; SSE41-NEXT: movq 8(%rdi), %r10
+; SSE41-NEXT: xorq 8(%rsi), %r10
+; SSE41-NEXT: xorq 24(%rsi), %r11
+; SSE41-NEXT: xorq (%rsi), %r8
+; SSE41-NEXT: xorq 16(%rsi), %r9
+; SSE41-NEXT: movq 48(%rdi), %rdx
+; SSE41-NEXT: movq 32(%rdi), %rax
+; SSE41-NEXT: movq 56(%rdi), %rcx
+; SSE41-NEXT: movq 40(%rdi), %rdi
+; SSE41-NEXT: xorq 40(%rsi), %rdi
+; SSE41-NEXT: xorq 56(%rsi), %rcx
+; SSE41-NEXT: orq %r11, %rcx
+; SSE41-NEXT: orq %rdi, %rcx
+; SSE41-NEXT: orq %r10, %rcx
+; SSE41-NEXT: xorq 32(%rsi), %rax
+; SSE41-NEXT: xorq 48(%rsi), %rdx
+; SSE41-NEXT: orq %r9, %rdx
+; SSE41-NEXT: orq %rax, %rdx
+; SSE41-NEXT: orq %r8, %rdx
+; SSE41-NEXT: xorl %eax, %eax
+; SSE41-NEXT: orq %rcx, %rdx
+; SSE41-NEXT: sete %al
+; SSE41-NEXT: retq
+;
; AVX1-LABEL: eq_i256_pair:
; AVX1: # %bb.0:
-; AVX1-NEXT: movq 16(%rdi), %r9
-; AVX1-NEXT: movq 24(%rdi), %r11
-; AVX1-NEXT: movq (%rdi), %r8
-; AVX1-NEXT: movq 8(%rdi), %r10
-; AVX1-NEXT: xorq 8(%rsi), %r10
-; AVX1-NEXT: xorq 24(%rsi), %r11
-; AVX1-NEXT: xorq (%rsi), %r8
-; AVX1-NEXT: xorq 16(%rsi), %r9
-; AVX1-NEXT: movq 48(%rdi), %rdx
-; AVX1-NEXT: movq 32(%rdi), %rax
-; AVX1-NEXT: movq 56(%rdi), %rcx
-; AVX1-NEXT: movq 40(%rdi), %rdi
-; AVX1-NEXT: xorq 40(%rsi), %rdi
-; AVX1-NEXT: xorq 56(%rsi), %rcx
-; AVX1-NEXT: orq %r11, %rcx
-; AVX1-NEXT: orq %rdi, %rcx
-; AVX1-NEXT: orq %r10, %rcx
-; AVX1-NEXT: xorq 32(%rsi), %rax
-; AVX1-NEXT: xorq 48(%rsi), %rdx
-; AVX1-NEXT: orq %r9, %rdx
-; AVX1-NEXT: orq %rax, %rdx
-; AVX1-NEXT: orq %r8, %rdx
+; AVX1-NEXT: vmovups (%rdi), %ymm0
+; AVX1-NEXT: vmovups 32(%rdi), %ymm1
+; AVX1-NEXT: vxorps 32(%rsi), %ymm1, %ymm1
+; AVX1-NEXT: vxorps (%rsi), %ymm0, %ymm0
+; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
; AVX1-NEXT: xorl %eax, %eax
-; AVX1-NEXT: orq %rcx, %rdx
+; AVX1-NEXT: vptest %ymm0, %ymm0
; AVX1-NEXT: sete %al
+; AVX1-NEXT: vzeroupper
; AVX1-NEXT: retq
;
-; AVX256-LABEL: eq_i256_pair:
-; AVX256: # %bb.0:
-; AVX256-NEXT: vmovdqu (%rdi), %ymm0
-; AVX256-NEXT: vmovdqu 32(%rdi), %ymm1
-; AVX256-NEXT: vpcmpeqb 32(%rsi), %ymm1, %ymm1
-; AVX256-NEXT: vpcmpeqb (%rsi), %ymm0, %ymm0
-; AVX256-NEXT: vpand %ymm1, %ymm0, %ymm0
-; AVX256-NEXT: vpmovmskb %ymm0, %ecx
-; AVX256-NEXT: xorl %eax, %eax
-; AVX256-NEXT: cmpl $-1, %ecx
-; AVX256-NEXT: sete %al
-; AVX256-NEXT: vzeroupper
-; AVX256-NEXT: retq
+; AVX2-LABEL: eq_i256_pair:
+; AVX2: # %bb.0:
+; AVX2-NEXT: vmovdqu (%rdi), %ymm0
+; AVX2-NEXT: vmovdqu 32(%rdi), %ymm1
+; AVX2-NEXT: vpxor 32(%rsi), %ymm1, %ymm1
+; AVX2-NEXT: vpxor (%rsi), %ymm0, %ymm0
+; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
+; AVX2-NEXT: xorl %eax, %eax
+; AVX2-NEXT: vptest %ymm0, %ymm0
+; AVX2-NEXT: sete %al
+; AVX2-NEXT: vzeroupper
+; AVX2-NEXT: retq
+;
+; AVX512-LABEL: eq_i256_pair:
+; AVX512: # %bb.0:
+; AVX512-NEXT: vmovdqu (%rdi), %ymm0
+; AVX512-NEXT: vmovdqu 32(%rdi), %ymm1
+; AVX512-NEXT: vpxor 32(%rsi), %ymm1, %ymm1
+; AVX512-NEXT: vpxor (%rsi), %ymm0, %ymm0
+; AVX512-NEXT: vpor %ymm1, %ymm0, %ymm0
+; AVX512-NEXT: xorl %eax, %eax
+; AVX512-NEXT: vptest %ymm0, %ymm0
+; AVX512-NEXT: sete %al
+; AVX512-NEXT: vzeroupper
+; AVX512-NEXT: retq
%a0 = load i256, i256* %a
%b0 = load i256, i256* %b
%xor1 = xor i256 %a0, %b0