@@ -422,6 +422,100 @@ define i32 @parity_8_mask(i32 %x) {
422
422
ret i32 %c
423
423
}
424
424
425
+ define 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
+
468
+ define 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
+
425
519
declare i4 @llvm.ctpop.i4 (i4 %x )
426
520
declare i8 @llvm.ctpop.i8 (i8 %x )
427
521
declare i16 @llvm.ctpop.i16 (i16 %x )
0 commit comments