[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / CodeGen / AArch64 / parity.ll
blobbdddb6f1069ce66311f35b6bc4407d54b4958b30
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -verify-machineinstrs -o - %s -mtriple=aarch64-linux-gnu | FileCheck %s
4 define i4 @parity_4(i4 %x) {
5 ; CHECK-LABEL: parity_4:
6 ; CHECK:       // %bb.0:
7 ; CHECK-NEXT:    and w8, w0, #0xf
8 ; CHECK-NEXT:    eor w8, w8, w8, lsr #2
9 ; CHECK-NEXT:    eor w8, w8, w8, lsr #1
10 ; CHECK-NEXT:    and w0, w8, #0x1
11 ; CHECK-NEXT:    ret
12   %1 = tail call i4 @llvm.ctpop.i4(i4 %x)
13   %2 = and i4 %1, 1
14   ret i4 %2
17 define i8 @parity_8(i8 %x) {
18 ; CHECK-LABEL: parity_8:
19 ; CHECK:       // %bb.0:
20 ; CHECK-NEXT:    and w8, w0, #0xff
21 ; CHECK-NEXT:    eor w8, w8, w8, lsr #4
22 ; CHECK-NEXT:    eor w8, w8, w8, lsr #2
23 ; CHECK-NEXT:    eor w8, w8, w8, lsr #1
24 ; CHECK-NEXT:    and w0, w8, #0x1
25 ; CHECK-NEXT:    ret
26   %1 = tail call i8 @llvm.ctpop.i8(i8 %x)
27   %2 = and i8 %1, 1
28   ret i8 %2
31 define i16 @parity_16(i16 %x) {
32 ; CHECK-LABEL: parity_16:
33 ; CHECK:       // %bb.0:
34 ; CHECK-NEXT:    and w8, w0, #0xffff
35 ; CHECK-NEXT:    eor w8, w8, w8, lsr #8
36 ; CHECK-NEXT:    eor w8, w8, w8, lsr #4
37 ; CHECK-NEXT:    eor w8, w8, w8, lsr #2
38 ; CHECK-NEXT:    eor w8, w8, w8, lsr #1
39 ; CHECK-NEXT:    and w0, w8, #0x1
40 ; CHECK-NEXT:    ret
41   %1 = tail call i16 @llvm.ctpop.i16(i16 %x)
42   %2 = and i16 %1, 1
43   ret i16 %2
46 define i17 @parity_17(i17 %x) {
47 ; CHECK-LABEL: parity_17:
48 ; CHECK:       // %bb.0:
49 ; CHECK-NEXT:    and w8, w0, #0x1ffff
50 ; CHECK-NEXT:    eor w8, w8, w8, lsr #16
51 ; CHECK-NEXT:    eor w8, w8, w8, lsr #8
52 ; CHECK-NEXT:    eor w8, w8, w8, lsr #4
53 ; CHECK-NEXT:    eor w8, w8, w8, lsr #2
54 ; CHECK-NEXT:    eor w8, w8, w8, lsr #1
55 ; CHECK-NEXT:    and w0, w8, #0x1
56 ; CHECK-NEXT:    ret
57   %1 = tail call i17 @llvm.ctpop.i17(i17 %x)
58   %2 = and i17 %1, 1
59   ret i17 %2
62 define i32 @parity_32(i32 %x) {
63 ; CHECK-LABEL: parity_32:
64 ; CHECK:       // %bb.0:
65 ; CHECK-NEXT:    eor w8, w0, w0, lsr #16
66 ; CHECK-NEXT:    eor w8, w8, w8, lsr #8
67 ; CHECK-NEXT:    eor w8, w8, w8, lsr #4
68 ; CHECK-NEXT:    eor w8, w8, w8, lsr #2
69 ; CHECK-NEXT:    eor w8, w8, w8, lsr #1
70 ; CHECK-NEXT:    and w0, w8, #0x1
71 ; CHECK-NEXT:    ret
72   %1 = tail call i32 @llvm.ctpop.i32(i32 %x)
73   %2 = and i32 %1, 1
74   ret i32 %2
77 define i64 @parity_64(i64 %x) {
78 ; CHECK-LABEL: parity_64:
79 ; CHECK:       // %bb.0:
80 ; CHECK-NEXT:    eor x8, x0, x0, lsr #32
81 ; CHECK-NEXT:    eor x8, x8, x8, lsr #16
82 ; CHECK-NEXT:    eor x8, x8, x8, lsr #8
83 ; CHECK-NEXT:    eor x8, x8, x8, lsr #4
84 ; CHECK-NEXT:    eor x8, x8, x8, lsr #2
85 ; CHECK-NEXT:    eor w8, w8, w8, lsr #1
86 ; CHECK-NEXT:    and x0, x8, #0x1
87 ; CHECK-NEXT:    ret
88   %1 = tail call i64 @llvm.ctpop.i64(i64 %x)
89   %2 = and i64 %1, 1
90   ret i64 %2
93 define i32 @parity_64_trunc(i64 %x) {
94 ; CHECK-LABEL: parity_64_trunc:
95 ; CHECK:       // %bb.0:
96 ; CHECK-NEXT:    eor x8, x0, x0, lsr #32
97 ; CHECK-NEXT:    eor x8, x8, x8, lsr #16
98 ; CHECK-NEXT:    eor x8, x8, x8, lsr #8
99 ; CHECK-NEXT:    eor x8, x8, x8, lsr #4
100 ; CHECK-NEXT:    eor x8, x8, x8, lsr #2
101 ; CHECK-NEXT:    eor w8, w8, w8, lsr #1
102 ; CHECK-NEXT:    and w0, w8, #0x1
103 ; CHECK-NEXT:    ret
104   %1 = tail call i64 @llvm.ctpop.i64(i64 %x)
105   %2 = trunc i64 %1 to i32
106   %3 = and i32 %2, 1
107   ret i32 %3
110 define i8 @parity_32_trunc(i32 %x) {
111 ; CHECK-LABEL: parity_32_trunc:
112 ; CHECK:       // %bb.0:
113 ; CHECK-NEXT:    eor w8, w0, w0, lsr #16
114 ; CHECK-NEXT:    eor w8, w8, w8, lsr #8
115 ; CHECK-NEXT:    eor w8, w8, w8, lsr #4
116 ; CHECK-NEXT:    eor w8, w8, w8, lsr #2
117 ; CHECK-NEXT:    eor w8, w8, w8, lsr #1
118 ; CHECK-NEXT:    and w0, w8, #0x1
119 ; CHECK-NEXT:    ret
120   %1 = tail call i32 @llvm.ctpop.i32(i32 %x)
121   %2 = trunc i32 %1 to i8
122   %3 = and i8 %2, 1
123   ret i8 %3
126 define i32 @parity_8_zext(i8 %x) {
127 ; CHECK-LABEL: parity_8_zext:
128 ; CHECK:       // %bb.0:
129 ; CHECK-NEXT:    and w8, w0, #0xff
130 ; CHECK-NEXT:    eor w8, w8, w8, lsr #4
131 ; CHECK-NEXT:    eor w8, w8, w8, lsr #2
132 ; CHECK-NEXT:    eor w8, w8, w8, lsr #1
133 ; CHECK-NEXT:    and w0, w8, #0x1
134 ; CHECK-NEXT:    ret
135   %a = zext i8 %x to i32
136   %b = tail call i32 @llvm.ctpop.i32(i32 %a)
137   %c = and i32 %b, 1
138   ret i32 %c
141 define i32 @parity_8_mask(i32 %x) {
142 ; CHECK-LABEL: parity_8_mask:
143 ; CHECK:       // %bb.0:
144 ; CHECK-NEXT:    and w8, w0, #0xff
145 ; CHECK-NEXT:    eor w8, w8, w8, lsr #4
146 ; CHECK-NEXT:    eor w8, w8, w8, lsr #2
147 ; CHECK-NEXT:    eor w8, w8, w8, lsr #1
148 ; CHECK-NEXT:    and w0, w8, #0x1
149 ; CHECK-NEXT:    ret
150   %a = and i32 %x, 255
151   %b = tail call i32 @llvm.ctpop.i32(i32 %a)
152   %c = and i32 %b, 1
153   ret i32 %c
156 declare i4 @llvm.ctpop.i4(i4 %x)
157 declare i8 @llvm.ctpop.i8(i8 %x)
158 declare i16 @llvm.ctpop.i16(i16 %x)
159 declare i17 @llvm.ctpop.i17(i17 %x)
160 declare i32 @llvm.ctpop.i32(i32 %x)
161 declare i64 @llvm.ctpop.i64(i64 %x)