[InstCombine] Signed saturation patterns
[llvm-complete.git] / test / CodeGen / X86 / parity.ll
blob9ad04db8c280fe284c5ef2d3e820d223b0bf5c70
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=-popcnt | FileCheck %s --check-prefix=X86-NOPOPCNT
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=-popcnt | FileCheck %s --check-prefix=X64-NOPOPCNT
4 ; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+popcnt | FileCheck %s --check-prefix=X86-POPCNT
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+popcnt | FileCheck %s --check-prefix=X64-POPCNT
7 define i32 @parity_32(i32 %x) {
8 ; X86-NOPOPCNT-LABEL: parity_32:
9 ; X86-NOPOPCNT:       # %bb.0:
10 ; X86-NOPOPCNT-NEXT:    movl {{[0-9]+}}(%esp), %eax
11 ; X86-NOPOPCNT-NEXT:    movl %eax, %ecx
12 ; X86-NOPOPCNT-NEXT:    shrl $16, %ecx
13 ; X86-NOPOPCNT-NEXT:    xorl %eax, %ecx
14 ; X86-NOPOPCNT-NEXT:    xorl %eax, %eax
15 ; X86-NOPOPCNT-NEXT:    xorb %ch, %cl
16 ; X86-NOPOPCNT-NEXT:    setnp %al
17 ; X86-NOPOPCNT-NEXT:    retl
19 ; X64-NOPOPCNT-LABEL: parity_32:
20 ; X64-NOPOPCNT:       # %bb.0:
21 ; X64-NOPOPCNT-NEXT:    movl %edi, %ecx
22 ; X64-NOPOPCNT-NEXT:    shrl $16, %ecx
23 ; X64-NOPOPCNT-NEXT:    xorl %edi, %ecx
24 ; X64-NOPOPCNT-NEXT:    movl %ecx, %edx
25 ; X64-NOPOPCNT-NEXT:    shrl $8, %edx
26 ; X64-NOPOPCNT-NEXT:    xorl %eax, %eax
27 ; X64-NOPOPCNT-NEXT:    xorb %cl, %dl
28 ; X64-NOPOPCNT-NEXT:    setnp %al
29 ; X64-NOPOPCNT-NEXT:    retq
31 ; X86-POPCNT-LABEL: parity_32:
32 ; X86-POPCNT:       # %bb.0:
33 ; X86-POPCNT-NEXT:    popcntl {{[0-9]+}}(%esp), %eax
34 ; X86-POPCNT-NEXT:    andl $1, %eax
35 ; X86-POPCNT-NEXT:    retl
37 ; X64-POPCNT-LABEL: parity_32:
38 ; X64-POPCNT:       # %bb.0:
39 ; X64-POPCNT-NEXT:    popcntl %edi, %eax
40 ; X64-POPCNT-NEXT:    andl $1, %eax
41 ; X64-POPCNT-NEXT:    retq
42   %1 = tail call i32 @llvm.ctpop.i32(i32 %x)
43   %2 = and i32 %1, 1
44   ret i32 %2
47 define i64 @parity_64(i64 %x) {
48 ; X86-NOPOPCNT-LABEL: parity_64:
49 ; X86-NOPOPCNT:       # %bb.0:
50 ; X86-NOPOPCNT-NEXT:    movl {{[0-9]+}}(%esp), %eax
51 ; X86-NOPOPCNT-NEXT:    xorl {{[0-9]+}}(%esp), %eax
52 ; X86-NOPOPCNT-NEXT:    movl %eax, %ecx
53 ; X86-NOPOPCNT-NEXT:    shrl $16, %ecx
54 ; X86-NOPOPCNT-NEXT:    xorl %eax, %ecx
55 ; X86-NOPOPCNT-NEXT:    xorl %eax, %eax
56 ; X86-NOPOPCNT-NEXT:    xorb %ch, %cl
57 ; X86-NOPOPCNT-NEXT:    setnp %al
58 ; X86-NOPOPCNT-NEXT:    xorl %edx, %edx
59 ; X86-NOPOPCNT-NEXT:    retl
61 ; X64-NOPOPCNT-LABEL: parity_64:
62 ; X64-NOPOPCNT:       # %bb.0:
63 ; X64-NOPOPCNT-NEXT:    movq %rdi, %rax
64 ; X64-NOPOPCNT-NEXT:    shrq $32, %rax
65 ; X64-NOPOPCNT-NEXT:    xorl %edi, %eax
66 ; X64-NOPOPCNT-NEXT:    movl %eax, %ecx
67 ; X64-NOPOPCNT-NEXT:    shrl $16, %ecx
68 ; X64-NOPOPCNT-NEXT:    xorl %eax, %ecx
69 ; X64-NOPOPCNT-NEXT:    movl %ecx, %edx
70 ; X64-NOPOPCNT-NEXT:    shrl $8, %edx
71 ; X64-NOPOPCNT-NEXT:    xorl %eax, %eax
72 ; X64-NOPOPCNT-NEXT:    xorb %cl, %dl
73 ; X64-NOPOPCNT-NEXT:    setnp %al
74 ; X64-NOPOPCNT-NEXT:    retq
76 ; X86-POPCNT-LABEL: parity_64:
77 ; X86-POPCNT:       # %bb.0:
78 ; X86-POPCNT-NEXT:    movl {{[0-9]+}}(%esp), %eax
79 ; X86-POPCNT-NEXT:    xorl {{[0-9]+}}(%esp), %eax
80 ; X86-POPCNT-NEXT:    popcntl %eax, %eax
81 ; X86-POPCNT-NEXT:    andl $1, %eax
82 ; X86-POPCNT-NEXT:    xorl %edx, %edx
83 ; X86-POPCNT-NEXT:    retl
85 ; X64-POPCNT-LABEL: parity_64:
86 ; X64-POPCNT:       # %bb.0:
87 ; X64-POPCNT-NEXT:    popcntq %rdi, %rax
88 ; X64-POPCNT-NEXT:    andl $1, %eax
89 ; X64-POPCNT-NEXT:    retq
90   %1 = tail call i64 @llvm.ctpop.i64(i64 %x)
91   %2 = and i64 %1, 1
92   ret i64 %2
95 declare i32 @llvm.ctpop.i32(i32 %x)
96 declare i64 @llvm.ctpop.i64(i64 %x)