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