• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
6
7define i4 @parity_4(i4 %x) {
8; X86-NOPOPCNT-LABEL: parity_4:
9; X86-NOPOPCNT:       # %bb.0:
10; X86-NOPOPCNT-NEXT:    testb $15, {{[0-9]+}}(%esp)
11; X86-NOPOPCNT-NEXT:    setnp %al
12; X86-NOPOPCNT-NEXT:    retl
13;
14; X64-NOPOPCNT-LABEL: parity_4:
15; X64-NOPOPCNT:       # %bb.0:
16; X64-NOPOPCNT-NEXT:    testb $15, %dil
17; X64-NOPOPCNT-NEXT:    setnp %al
18; X64-NOPOPCNT-NEXT:    retq
19;
20; X86-POPCNT-LABEL: parity_4:
21; X86-POPCNT:       # %bb.0:
22; X86-POPCNT-NEXT:    testb $15, {{[0-9]+}}(%esp)
23; X86-POPCNT-NEXT:    setnp %al
24; X86-POPCNT-NEXT:    retl
25;
26; X64-POPCNT-LABEL: parity_4:
27; X64-POPCNT:       # %bb.0:
28; X64-POPCNT-NEXT:    testb $15, %dil
29; X64-POPCNT-NEXT:    setnp %al
30; X64-POPCNT-NEXT:    retq
31  %1 = tail call i4 @llvm.ctpop.i4(i4 %x)
32  %2 = and i4 %1, 1
33  ret i4 %2
34}
35
36define i8 @parity_8(i8 %x) {
37; X86-NOPOPCNT-LABEL: parity_8:
38; X86-NOPOPCNT:       # %bb.0:
39; X86-NOPOPCNT-NEXT:    cmpb $0, {{[0-9]+}}(%esp)
40; X86-NOPOPCNT-NEXT:    setnp %al
41; X86-NOPOPCNT-NEXT:    retl
42;
43; X64-NOPOPCNT-LABEL: parity_8:
44; X64-NOPOPCNT:       # %bb.0:
45; X64-NOPOPCNT-NEXT:    testb %dil, %dil
46; X64-NOPOPCNT-NEXT:    setnp %al
47; X64-NOPOPCNT-NEXT:    retq
48;
49; X86-POPCNT-LABEL: parity_8:
50; X86-POPCNT:       # %bb.0:
51; X86-POPCNT-NEXT:    cmpb $0, {{[0-9]+}}(%esp)
52; X86-POPCNT-NEXT:    setnp %al
53; X86-POPCNT-NEXT:    retl
54;
55; X64-POPCNT-LABEL: parity_8:
56; X64-POPCNT:       # %bb.0:
57; X64-POPCNT-NEXT:    testb %dil, %dil
58; X64-POPCNT-NEXT:    setnp %al
59; X64-POPCNT-NEXT:    retq
60  %1 = tail call i8 @llvm.ctpop.i8(i8 %x)
61  %2 = and i8 %1, 1
62  ret i8 %2
63}
64
65define i16 @parity_16(i16 %x) {
66; X86-NOPOPCNT-LABEL: parity_16:
67; X86-NOPOPCNT:       # %bb.0:
68; X86-NOPOPCNT-NEXT:    movl {{[0-9]+}}(%esp), %ecx
69; X86-NOPOPCNT-NEXT:    xorl %eax, %eax
70; X86-NOPOPCNT-NEXT:    xorb %ch, %cl
71; X86-NOPOPCNT-NEXT:    setnp %al
72; X86-NOPOPCNT-NEXT:    # kill: def $ax killed $ax killed $eax
73; X86-NOPOPCNT-NEXT:    retl
74;
75; X64-NOPOPCNT-LABEL: parity_16:
76; X64-NOPOPCNT:       # %bb.0:
77; X64-NOPOPCNT-NEXT:    movl %edi, %ecx
78; X64-NOPOPCNT-NEXT:    xorl %eax, %eax
79; X64-NOPOPCNT-NEXT:    xorb %ch, %cl
80; X64-NOPOPCNT-NEXT:    setnp %al
81; X64-NOPOPCNT-NEXT:    # kill: def $ax killed $ax killed $eax
82; X64-NOPOPCNT-NEXT:    retq
83;
84; X86-POPCNT-LABEL: parity_16:
85; X86-POPCNT:       # %bb.0:
86; X86-POPCNT-NEXT:    popcntw {{[0-9]+}}(%esp), %ax
87; X86-POPCNT-NEXT:    andl $1, %eax
88; X86-POPCNT-NEXT:    # kill: def $ax killed $ax killed $eax
89; X86-POPCNT-NEXT:    retl
90;
91; X64-POPCNT-LABEL: parity_16:
92; X64-POPCNT:       # %bb.0:
93; X64-POPCNT-NEXT:    popcntw %di, %ax
94; X64-POPCNT-NEXT:    andl $1, %eax
95; X64-POPCNT-NEXT:    # kill: def $ax killed $ax killed $eax
96; X64-POPCNT-NEXT:    retq
97  %1 = tail call i16 @llvm.ctpop.i16(i16 %x)
98  %2 = and i16 %1, 1
99  ret i16 %2
100}
101
102define i16 @parity_16_load(i16* %x) {
103; X86-NOPOPCNT-LABEL: parity_16_load:
104; X86-NOPOPCNT:       # %bb.0:
105; X86-NOPOPCNT-NEXT:    movl {{[0-9]+}}(%esp), %eax
106; X86-NOPOPCNT-NEXT:    movzwl (%eax), %ecx
107; X86-NOPOPCNT-NEXT:    xorl %eax, %eax
108; X86-NOPOPCNT-NEXT:    xorb %ch, %cl
109; X86-NOPOPCNT-NEXT:    setnp %al
110; X86-NOPOPCNT-NEXT:    # kill: def $ax killed $ax killed $eax
111; X86-NOPOPCNT-NEXT:    retl
112;
113; X64-NOPOPCNT-LABEL: parity_16_load:
114; X64-NOPOPCNT:       # %bb.0:
115; X64-NOPOPCNT-NEXT:    movzwl (%rdi), %ecx
116; X64-NOPOPCNT-NEXT:    xorl %eax, %eax
117; X64-NOPOPCNT-NEXT:    xorb %ch, %cl
118; X64-NOPOPCNT-NEXT:    setnp %al
119; X64-NOPOPCNT-NEXT:    # kill: def $ax killed $ax killed $eax
120; X64-NOPOPCNT-NEXT:    retq
121;
122; X86-POPCNT-LABEL: parity_16_load:
123; X86-POPCNT:       # %bb.0:
124; X86-POPCNT-NEXT:    movl {{[0-9]+}}(%esp), %eax
125; X86-POPCNT-NEXT:    popcntw (%eax), %ax
126; X86-POPCNT-NEXT:    andl $1, %eax
127; X86-POPCNT-NEXT:    # kill: def $ax killed $ax killed $eax
128; X86-POPCNT-NEXT:    retl
129;
130; X64-POPCNT-LABEL: parity_16_load:
131; X64-POPCNT:       # %bb.0:
132; X64-POPCNT-NEXT:    popcntw (%rdi), %ax
133; X64-POPCNT-NEXT:    andl $1, %eax
134; X64-POPCNT-NEXT:    # kill: def $ax killed $ax killed $eax
135; X64-POPCNT-NEXT:    retq
136  %1 = load i16, i16* %x
137  %2 = tail call i16 @llvm.ctpop.i16(i16 %1)
138  %3 = and i16 %2, 1
139  ret i16 %3
140}
141
142define i17 @parity_17(i17 %x) {
143; X86-NOPOPCNT-LABEL: parity_17:
144; X86-NOPOPCNT:       # %bb.0:
145; X86-NOPOPCNT-NEXT:    movl {{[0-9]+}}(%esp), %ecx
146; X86-NOPOPCNT-NEXT:    movl %ecx, %eax
147; X86-NOPOPCNT-NEXT:    andl $131071, %eax # imm = 0x1FFFF
148; X86-NOPOPCNT-NEXT:    movl %eax, %edx
149; X86-NOPOPCNT-NEXT:    shrl $16, %edx
150; X86-NOPOPCNT-NEXT:    xorl %eax, %edx
151; X86-NOPOPCNT-NEXT:    xorl %eax, %eax
152; X86-NOPOPCNT-NEXT:    xorb %dl, %ch
153; X86-NOPOPCNT-NEXT:    setnp %al
154; X86-NOPOPCNT-NEXT:    retl
155;
156; X64-NOPOPCNT-LABEL: parity_17:
157; X64-NOPOPCNT:       # %bb.0:
158; X64-NOPOPCNT-NEXT:    movl %edi, %eax
159; X64-NOPOPCNT-NEXT:    andl $131071, %eax # imm = 0x1FFFF
160; X64-NOPOPCNT-NEXT:    movl %eax, %ecx
161; X64-NOPOPCNT-NEXT:    shrl $16, %ecx
162; X64-NOPOPCNT-NEXT:    xorl %eax, %ecx
163; X64-NOPOPCNT-NEXT:    shrl $8, %edi
164; X64-NOPOPCNT-NEXT:    xorl %eax, %eax
165; X64-NOPOPCNT-NEXT:    xorb %cl, %dil
166; X64-NOPOPCNT-NEXT:    setnp %al
167; X64-NOPOPCNT-NEXT:    retq
168;
169; X86-POPCNT-LABEL: parity_17:
170; X86-POPCNT:       # %bb.0:
171; X86-POPCNT-NEXT:    movl $131071, %eax # imm = 0x1FFFF
172; X86-POPCNT-NEXT:    andl {{[0-9]+}}(%esp), %eax
173; X86-POPCNT-NEXT:    popcntl %eax, %eax
174; X86-POPCNT-NEXT:    andl $1, %eax
175; X86-POPCNT-NEXT:    retl
176;
177; X64-POPCNT-LABEL: parity_17:
178; X64-POPCNT:       # %bb.0:
179; X64-POPCNT-NEXT:    andl $131071, %edi # imm = 0x1FFFF
180; X64-POPCNT-NEXT:    popcntl %edi, %eax
181; X64-POPCNT-NEXT:    andl $1, %eax
182; X64-POPCNT-NEXT:    retq
183  %1 = tail call i17 @llvm.ctpop.i17(i17 %x)
184  %2 = and i17 %1, 1
185  ret i17 %2
186}
187
188define i32 @parity_32(i32 %x) {
189; X86-NOPOPCNT-LABEL: parity_32:
190; X86-NOPOPCNT:       # %bb.0:
191; X86-NOPOPCNT-NEXT:    movl {{[0-9]+}}(%esp), %eax
192; X86-NOPOPCNT-NEXT:    movl %eax, %ecx
193; X86-NOPOPCNT-NEXT:    shrl $16, %ecx
194; X86-NOPOPCNT-NEXT:    xorl %eax, %ecx
195; X86-NOPOPCNT-NEXT:    xorl %eax, %eax
196; X86-NOPOPCNT-NEXT:    xorb %ch, %cl
197; X86-NOPOPCNT-NEXT:    setnp %al
198; X86-NOPOPCNT-NEXT:    retl
199;
200; X64-NOPOPCNT-LABEL: parity_32:
201; X64-NOPOPCNT:       # %bb.0:
202; X64-NOPOPCNT-NEXT:    movl %edi, %ecx
203; X64-NOPOPCNT-NEXT:    shrl $16, %ecx
204; X64-NOPOPCNT-NEXT:    xorl %edi, %ecx
205; X64-NOPOPCNT-NEXT:    xorl %eax, %eax
206; X64-NOPOPCNT-NEXT:    xorb %ch, %cl
207; X64-NOPOPCNT-NEXT:    setnp %al
208; X64-NOPOPCNT-NEXT:    retq
209;
210; X86-POPCNT-LABEL: parity_32:
211; X86-POPCNT:       # %bb.0:
212; X86-POPCNT-NEXT:    popcntl {{[0-9]+}}(%esp), %eax
213; X86-POPCNT-NEXT:    andl $1, %eax
214; X86-POPCNT-NEXT:    retl
215;
216; X64-POPCNT-LABEL: parity_32:
217; X64-POPCNT:       # %bb.0:
218; X64-POPCNT-NEXT:    popcntl %edi, %eax
219; X64-POPCNT-NEXT:    andl $1, %eax
220; X64-POPCNT-NEXT:    retq
221  %1 = tail call i32 @llvm.ctpop.i32(i32 %x)
222  %2 = and i32 %1, 1
223  ret i32 %2
224}
225
226define i64 @parity_64(i64 %x) {
227; X86-NOPOPCNT-LABEL: parity_64:
228; X86-NOPOPCNT:       # %bb.0:
229; X86-NOPOPCNT-NEXT:    movl {{[0-9]+}}(%esp), %eax
230; X86-NOPOPCNT-NEXT:    xorl {{[0-9]+}}(%esp), %eax
231; X86-NOPOPCNT-NEXT:    movl %eax, %ecx
232; X86-NOPOPCNT-NEXT:    shrl $16, %ecx
233; X86-NOPOPCNT-NEXT:    xorl %eax, %ecx
234; X86-NOPOPCNT-NEXT:    xorl %eax, %eax
235; X86-NOPOPCNT-NEXT:    xorb %ch, %cl
236; X86-NOPOPCNT-NEXT:    setnp %al
237; X86-NOPOPCNT-NEXT:    xorl %edx, %edx
238; X86-NOPOPCNT-NEXT:    retl
239;
240; X64-NOPOPCNT-LABEL: parity_64:
241; X64-NOPOPCNT:       # %bb.0:
242; X64-NOPOPCNT-NEXT:    movq %rdi, %rax
243; X64-NOPOPCNT-NEXT:    shrq $32, %rax
244; X64-NOPOPCNT-NEXT:    xorl %edi, %eax
245; X64-NOPOPCNT-NEXT:    movl %eax, %ecx
246; X64-NOPOPCNT-NEXT:    shrl $16, %ecx
247; X64-NOPOPCNT-NEXT:    xorl %eax, %ecx
248; X64-NOPOPCNT-NEXT:    xorl %eax, %eax
249; X64-NOPOPCNT-NEXT:    xorb %ch, %cl
250; X64-NOPOPCNT-NEXT:    setnp %al
251; X64-NOPOPCNT-NEXT:    retq
252;
253; X86-POPCNT-LABEL: parity_64:
254; X86-POPCNT:       # %bb.0:
255; X86-POPCNT-NEXT:    movl {{[0-9]+}}(%esp), %eax
256; X86-POPCNT-NEXT:    xorl {{[0-9]+}}(%esp), %eax
257; X86-POPCNT-NEXT:    popcntl %eax, %eax
258; X86-POPCNT-NEXT:    andl $1, %eax
259; X86-POPCNT-NEXT:    xorl %edx, %edx
260; X86-POPCNT-NEXT:    retl
261;
262; X64-POPCNT-LABEL: parity_64:
263; X64-POPCNT:       # %bb.0:
264; X64-POPCNT-NEXT:    popcntq %rdi, %rax
265; X64-POPCNT-NEXT:    andl $1, %eax
266; X64-POPCNT-NEXT:    retq
267  %1 = tail call i64 @llvm.ctpop.i64(i64 %x)
268  %2 = and i64 %1, 1
269  ret i64 %2
270}
271
272define i32 @parity_64_trunc(i64 %x) {
273; X86-NOPOPCNT-LABEL: parity_64_trunc:
274; X86-NOPOPCNT:       # %bb.0:
275; X86-NOPOPCNT-NEXT:    movl {{[0-9]+}}(%esp), %eax
276; X86-NOPOPCNT-NEXT:    xorl {{[0-9]+}}(%esp), %eax
277; X86-NOPOPCNT-NEXT:    movl %eax, %ecx
278; X86-NOPOPCNT-NEXT:    shrl $16, %ecx
279; X86-NOPOPCNT-NEXT:    xorl %eax, %ecx
280; X86-NOPOPCNT-NEXT:    xorl %eax, %eax
281; X86-NOPOPCNT-NEXT:    xorb %ch, %cl
282; X86-NOPOPCNT-NEXT:    setnp %al
283; X86-NOPOPCNT-NEXT:    retl
284;
285; X64-NOPOPCNT-LABEL: parity_64_trunc:
286; X64-NOPOPCNT:       # %bb.0:
287; X64-NOPOPCNT-NEXT:    movq %rdi, %rax
288; X64-NOPOPCNT-NEXT:    shrq $32, %rax
289; X64-NOPOPCNT-NEXT:    xorl %edi, %eax
290; X64-NOPOPCNT-NEXT:    movl %eax, %ecx
291; X64-NOPOPCNT-NEXT:    shrl $16, %ecx
292; X64-NOPOPCNT-NEXT:    xorl %eax, %ecx
293; X64-NOPOPCNT-NEXT:    xorl %eax, %eax
294; X64-NOPOPCNT-NEXT:    xorb %ch, %cl
295; X64-NOPOPCNT-NEXT:    setnp %al
296; X64-NOPOPCNT-NEXT:    retq
297;
298; X86-POPCNT-LABEL: parity_64_trunc:
299; X86-POPCNT:       # %bb.0:
300; X86-POPCNT-NEXT:    movl {{[0-9]+}}(%esp), %eax
301; X86-POPCNT-NEXT:    xorl {{[0-9]+}}(%esp), %eax
302; X86-POPCNT-NEXT:    popcntl %eax, %eax
303; X86-POPCNT-NEXT:    andl $1, %eax
304; X86-POPCNT-NEXT:    retl
305;
306; X64-POPCNT-LABEL: parity_64_trunc:
307; X64-POPCNT:       # %bb.0:
308; X64-POPCNT-NEXT:    popcntq %rdi, %rax
309; X64-POPCNT-NEXT:    andl $1, %eax
310; X64-POPCNT-NEXT:    # kill: def $eax killed $eax killed $rax
311; X64-POPCNT-NEXT:    retq
312  %1 = tail call i64 @llvm.ctpop.i64(i64 %x)
313  %2 = trunc i64 %1 to i32
314  %3 = and i32 %2, 1
315  ret i32 %3
316}
317
318define i8 @parity_32_trunc(i32 %x) {
319; X86-NOPOPCNT-LABEL: parity_32_trunc:
320; X86-NOPOPCNT:       # %bb.0:
321; X86-NOPOPCNT-NEXT:    movl {{[0-9]+}}(%esp), %eax
322; X86-NOPOPCNT-NEXT:    movl %eax, %ecx
323; X86-NOPOPCNT-NEXT:    shrl $16, %ecx
324; X86-NOPOPCNT-NEXT:    xorl %eax, %ecx
325; X86-NOPOPCNT-NEXT:    xorb %ch, %cl
326; X86-NOPOPCNT-NEXT:    setnp %al
327; X86-NOPOPCNT-NEXT:    retl
328;
329; X64-NOPOPCNT-LABEL: parity_32_trunc:
330; X64-NOPOPCNT:       # %bb.0:
331; X64-NOPOPCNT-NEXT:    movl %edi, %eax
332; X64-NOPOPCNT-NEXT:    shrl $16, %eax
333; X64-NOPOPCNT-NEXT:    xorl %edi, %eax
334; X64-NOPOPCNT-NEXT:    xorb %ah, %al
335; X64-NOPOPCNT-NEXT:    setnp %al
336; X64-NOPOPCNT-NEXT:    retq
337;
338; X86-POPCNT-LABEL: parity_32_trunc:
339; X86-POPCNT:       # %bb.0:
340; X86-POPCNT-NEXT:    popcntl {{[0-9]+}}(%esp), %eax
341; X86-POPCNT-NEXT:    andl $1, %eax
342; X86-POPCNT-NEXT:    # kill: def $al killed $al killed $eax
343; X86-POPCNT-NEXT:    retl
344;
345; X64-POPCNT-LABEL: parity_32_trunc:
346; X64-POPCNT:       # %bb.0:
347; X64-POPCNT-NEXT:    popcntl %edi, %eax
348; X64-POPCNT-NEXT:    andl $1, %eax
349; X64-POPCNT-NEXT:    # kill: def $al killed $al killed $eax
350; X64-POPCNT-NEXT:    retq
351  %1 = tail call i32 @llvm.ctpop.i32(i32 %x)
352  %2 = trunc i32 %1 to i8
353  %3 = and i8 %2, 1
354  ret i8 %3
355}
356
357define i32 @parity_8_zext(i8 %x) {
358; X86-NOPOPCNT-LABEL: parity_8_zext:
359; X86-NOPOPCNT:       # %bb.0:
360; X86-NOPOPCNT-NEXT:    xorl %eax, %eax
361; X86-NOPOPCNT-NEXT:    cmpb $0, {{[0-9]+}}(%esp)
362; X86-NOPOPCNT-NEXT:    setnp %al
363; X86-NOPOPCNT-NEXT:    retl
364;
365; X64-NOPOPCNT-LABEL: parity_8_zext:
366; X64-NOPOPCNT:       # %bb.0:
367; X64-NOPOPCNT-NEXT:    xorl %eax, %eax
368; X64-NOPOPCNT-NEXT:    testb %dil, %dil
369; X64-NOPOPCNT-NEXT:    setnp %al
370; X64-NOPOPCNT-NEXT:    retq
371;
372; X86-POPCNT-LABEL: parity_8_zext:
373; X86-POPCNT:       # %bb.0:
374; X86-POPCNT-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
375; X86-POPCNT-NEXT:    popcntl %eax, %eax
376; X86-POPCNT-NEXT:    andl $1, %eax
377; X86-POPCNT-NEXT:    retl
378;
379; X64-POPCNT-LABEL: parity_8_zext:
380; X64-POPCNT:       # %bb.0:
381; X64-POPCNT-NEXT:    movzbl %dil, %eax
382; X64-POPCNT-NEXT:    popcntl %eax, %eax
383; X64-POPCNT-NEXT:    andl $1, %eax
384; X64-POPCNT-NEXT:    retq
385  %a = zext i8 %x to i32
386  %b = tail call i32 @llvm.ctpop.i32(i32 %a)
387  %c = and i32 %b, 1
388  ret i32 %c
389}
390
391define i32 @parity_8_mask(i32 %x) {
392; X86-NOPOPCNT-LABEL: parity_8_mask:
393; X86-NOPOPCNT:       # %bb.0:
394; X86-NOPOPCNT-NEXT:    xorl %eax, %eax
395; X86-NOPOPCNT-NEXT:    cmpb $0, {{[0-9]+}}(%esp)
396; X86-NOPOPCNT-NEXT:    setnp %al
397; X86-NOPOPCNT-NEXT:    retl
398;
399; X64-NOPOPCNT-LABEL: parity_8_mask:
400; X64-NOPOPCNT:       # %bb.0:
401; X64-NOPOPCNT-NEXT:    xorl %eax, %eax
402; X64-NOPOPCNT-NEXT:    testb %dil, %dil
403; X64-NOPOPCNT-NEXT:    setnp %al
404; X64-NOPOPCNT-NEXT:    retq
405;
406; X86-POPCNT-LABEL: parity_8_mask:
407; X86-POPCNT:       # %bb.0:
408; X86-POPCNT-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
409; X86-POPCNT-NEXT:    popcntl %eax, %eax
410; X86-POPCNT-NEXT:    andl $1, %eax
411; X86-POPCNT-NEXT:    retl
412;
413; X64-POPCNT-LABEL: parity_8_mask:
414; X64-POPCNT:       # %bb.0:
415; X64-POPCNT-NEXT:    movzbl %dil, %eax
416; X64-POPCNT-NEXT:    popcntl %eax, %eax
417; X64-POPCNT-NEXT:    andl $1, %eax
418; X64-POPCNT-NEXT:    retq
419  %a = and i32 %x, 255
420  %b = tail call i32 @llvm.ctpop.i32(i32 %a)
421  %c = and i32 %b, 1
422  ret i32 %c
423}
424
425define i32 @parity_32_shift(i32 %0) {
426; X86-NOPOPCNT-LABEL: parity_32_shift:
427; X86-NOPOPCNT:       # %bb.0:
428; X86-NOPOPCNT-NEXT:    movl {{[0-9]+}}(%esp), %eax
429; X86-NOPOPCNT-NEXT:    movl %eax, %ecx
430; X86-NOPOPCNT-NEXT:    shrl $16, %ecx
431; X86-NOPOPCNT-NEXT:    xorl %eax, %ecx
432; X86-NOPOPCNT-NEXT:    xorl %eax, %eax
433; X86-NOPOPCNT-NEXT:    xorb %ch, %cl
434; X86-NOPOPCNT-NEXT:    setnp %al
435; X86-NOPOPCNT-NEXT:    addl %eax, %eax
436; X86-NOPOPCNT-NEXT:    retl
437;
438; X64-NOPOPCNT-LABEL: parity_32_shift:
439; X64-NOPOPCNT:       # %bb.0:
440; X64-NOPOPCNT-NEXT:    movl %edi, %ecx
441; X64-NOPOPCNT-NEXT:    shrl $16, %ecx
442; X64-NOPOPCNT-NEXT:    xorl %edi, %ecx
443; X64-NOPOPCNT-NEXT:    xorl %eax, %eax
444; X64-NOPOPCNT-NEXT:    xorb %ch, %cl
445; X64-NOPOPCNT-NEXT:    setnp %al
446; X64-NOPOPCNT-NEXT:    addl %eax, %eax
447; X64-NOPOPCNT-NEXT:    retq
448;
449; X86-POPCNT-LABEL: parity_32_shift:
450; X86-POPCNT:       # %bb.0:
451; X86-POPCNT-NEXT:    popcntl {{[0-9]+}}(%esp), %eax
452; X86-POPCNT-NEXT:    andl $1, %eax
453; X86-POPCNT-NEXT:    addl %eax, %eax
454; X86-POPCNT-NEXT:    retl
455;
456; X64-POPCNT-LABEL: parity_32_shift:
457; X64-POPCNT:       # %bb.0:
458; X64-POPCNT-NEXT:    popcntl %edi, %eax
459; X64-POPCNT-NEXT:    andl $1, %eax
460; X64-POPCNT-NEXT:    addl %eax, %eax
461; X64-POPCNT-NEXT:    retq
462  %2 = tail call i32 @llvm.ctpop.i32(i32 %0)
463  %3 = shl nuw nsw i32 %2, 1
464  %4 = and i32 %3, 2
465  ret i32 %4
466}
467
468define i64 @parity_64_shift(i64 %0) {
469; X86-NOPOPCNT-LABEL: parity_64_shift:
470; X86-NOPOPCNT:       # %bb.0:
471; X86-NOPOPCNT-NEXT:    movl {{[0-9]+}}(%esp), %eax
472; X86-NOPOPCNT-NEXT:    xorl {{[0-9]+}}(%esp), %eax
473; X86-NOPOPCNT-NEXT:    movl %eax, %ecx
474; X86-NOPOPCNT-NEXT:    shrl $16, %ecx
475; X86-NOPOPCNT-NEXT:    xorl %eax, %ecx
476; X86-NOPOPCNT-NEXT:    xorl %eax, %eax
477; X86-NOPOPCNT-NEXT:    xorb %ch, %cl
478; X86-NOPOPCNT-NEXT:    setnp %al
479; X86-NOPOPCNT-NEXT:    addl %eax, %eax
480; X86-NOPOPCNT-NEXT:    xorl %edx, %edx
481; X86-NOPOPCNT-NEXT:    retl
482;
483; X64-NOPOPCNT-LABEL: parity_64_shift:
484; X64-NOPOPCNT:       # %bb.0:
485; X64-NOPOPCNT-NEXT:    movq %rdi, %rax
486; X64-NOPOPCNT-NEXT:    shrq $32, %rax
487; X64-NOPOPCNT-NEXT:    xorl %edi, %eax
488; X64-NOPOPCNT-NEXT:    movl %eax, %ecx
489; X64-NOPOPCNT-NEXT:    shrl $16, %ecx
490; X64-NOPOPCNT-NEXT:    xorl %eax, %ecx
491; X64-NOPOPCNT-NEXT:    xorl %eax, %eax
492; X64-NOPOPCNT-NEXT:    xorb %ch, %cl
493; X64-NOPOPCNT-NEXT:    setnp %al
494; X64-NOPOPCNT-NEXT:    addq %rax, %rax
495; X64-NOPOPCNT-NEXT:    retq
496;
497; X86-POPCNT-LABEL: parity_64_shift:
498; X86-POPCNT:       # %bb.0:
499; X86-POPCNT-NEXT:    movl {{[0-9]+}}(%esp), %eax
500; X86-POPCNT-NEXT:    xorl {{[0-9]+}}(%esp), %eax
501; X86-POPCNT-NEXT:    popcntl %eax, %eax
502; X86-POPCNT-NEXT:    andl $1, %eax
503; X86-POPCNT-NEXT:    addl %eax, %eax
504; X86-POPCNT-NEXT:    xorl %edx, %edx
505; X86-POPCNT-NEXT:    retl
506;
507; X64-POPCNT-LABEL: parity_64_shift:
508; X64-POPCNT:       # %bb.0:
509; X64-POPCNT-NEXT:    popcntq %rdi, %rax
510; X64-POPCNT-NEXT:    andl $1, %eax
511; X64-POPCNT-NEXT:    addq %rax, %rax
512; X64-POPCNT-NEXT:    retq
513  %2 = tail call i64 @llvm.ctpop.i64(i64 %0)
514  %3 = shl nuw nsw i64 %2, 1
515  %4 = and i64 %3, 2
516  ret i64 %4
517}
518
519declare i4 @llvm.ctpop.i4(i4 %x)
520declare i8 @llvm.ctpop.i8(i8 %x)
521declare i16 @llvm.ctpop.i16(i16 %x)
522declare i17 @llvm.ctpop.i17(i17 %x)
523declare i32 @llvm.ctpop.i32(i32 %x)
524declare i64 @llvm.ctpop.i64(i64 %x)
525