@@ -33,22 +33,19 @@ define i64 @ctpop_mask2(i64 %x) nounwind readnone {
33
33
; X86-NO-POPCOUNT: # %bb.0:
34
34
; X86-NO-POPCOUNT-NEXT: movl {{[0-9]+}}(%esp), %eax
35
35
; X86-NO-POPCOUNT-NEXT: andl $3, %eax
36
- ; X86-NO-POPCOUNT-NEXT: imull $134480385, %eax, %eax # imm = 0x8040201
37
- ; X86-NO-POPCOUNT-NEXT: shrl $3, %eax
38
- ; X86-NO-POPCOUNT-NEXT: andl $17895697, %eax # imm = 0x1111111
39
- ; X86-NO-POPCOUNT-NEXT: imull $286331153, %eax, %eax # imm = 0x11111111
40
- ; X86-NO-POPCOUNT-NEXT: shrl $28, %eax
36
+ ; X86-NO-POPCOUNT-NEXT: movl %eax, %ecx
37
+ ; X86-NO-POPCOUNT-NEXT: shrl %ecx
38
+ ; X86-NO-POPCOUNT-NEXT: subl %ecx, %eax
41
39
; X86-NO-POPCOUNT-NEXT: xorl %edx, %edx
42
40
; X86-NO-POPCOUNT-NEXT: retl
43
41
;
44
42
; X64-NO-POPCOUNT-LABEL: ctpop_mask2:
45
43
; X64-NO-POPCOUNT: # %bb.0:
46
- ; X64-NO-POPCOUNT-NEXT: andl $3, %edi
47
- ; X64-NO-POPCOUNT-NEXT: imull $134480385, %edi, %eax # imm = 0x8040201
48
- ; X64-NO-POPCOUNT-NEXT: shrl $3, %eax
49
- ; X64-NO-POPCOUNT-NEXT: andl $17895697, %eax # imm = 0x1111111
50
- ; X64-NO-POPCOUNT-NEXT: imull $286331153, %eax, %eax # imm = 0x11111111
51
- ; X64-NO-POPCOUNT-NEXT: shrl $28, %eax
44
+ ; X64-NO-POPCOUNT-NEXT: movq %rdi, %rax
45
+ ; X64-NO-POPCOUNT-NEXT: andl $3, %eax
46
+ ; X64-NO-POPCOUNT-NEXT: movl %eax, %ecx
47
+ ; X64-NO-POPCOUNT-NEXT: shrl %ecx
48
+ ; X64-NO-POPCOUNT-NEXT: subl %ecx, %eax
52
49
; X64-NO-POPCOUNT-NEXT: retq
53
50
%mask = and i64 %x , 3
54
51
%count = tail call i64 @llvm.ctpop.i64 (i64 %mask )
@@ -71,25 +68,22 @@ define i32 @ctpop_shifted_mask2(i32 %x) nounwind readnone {
71
68
;
72
69
; X86-NO-POPCOUNT-LABEL: ctpop_shifted_mask2:
73
70
; X86-NO-POPCOUNT: # %bb.0:
74
- ; X86-NO-POPCOUNT-NEXT: movl {{[0-9]+}}(%esp), %eax
71
+ ; X86-NO-POPCOUNT-NEXT: movl $1572864, %eax # imm = 0x180000
72
+ ; X86-NO-POPCOUNT-NEXT: andl {{[0-9]+}}(%esp), %eax
73
+ ; X86-NO-POPCOUNT-NEXT: movl %eax, %ecx
74
+ ; X86-NO-POPCOUNT-NEXT: shrl $20, %ecx
75
75
; X86-NO-POPCOUNT-NEXT: shrl $19, %eax
76
- ; X86-NO-POPCOUNT-NEXT: andl $3, %eax
77
- ; X86-NO-POPCOUNT-NEXT: imull $134480385, %eax, %eax # imm = 0x8040201
78
- ; X86-NO-POPCOUNT-NEXT: shrl $3, %eax
79
- ; X86-NO-POPCOUNT-NEXT: andl $17895697, %eax # imm = 0x1111111
80
- ; X86-NO-POPCOUNT-NEXT: imull $286331153, %eax, %eax # imm = 0x11111111
81
- ; X86-NO-POPCOUNT-NEXT: shrl $28, %eax
76
+ ; X86-NO-POPCOUNT-NEXT: subl %ecx, %eax
82
77
; X86-NO-POPCOUNT-NEXT: retl
83
78
;
84
79
; X64-NO-POPCOUNT-LABEL: ctpop_shifted_mask2:
85
80
; X64-NO-POPCOUNT: # %bb.0:
86
- ; X64-NO-POPCOUNT-NEXT: shrl $19, %edi
87
- ; X64-NO-POPCOUNT-NEXT: andl $3, %edi
88
- ; X64-NO-POPCOUNT-NEXT: imull $134480385, %edi, %eax # imm = 0x8040201
89
- ; X64-NO-POPCOUNT-NEXT: shrl $3, %eax
90
- ; X64-NO-POPCOUNT-NEXT: andl $17895697, %eax # imm = 0x1111111
91
- ; X64-NO-POPCOUNT-NEXT: imull $286331153, %eax, %eax # imm = 0x11111111
92
- ; X64-NO-POPCOUNT-NEXT: shrl $28, %eax
81
+ ; X64-NO-POPCOUNT-NEXT: movl %edi, %eax
82
+ ; X64-NO-POPCOUNT-NEXT: andl $1572864, %eax # imm = 0x180000
83
+ ; X64-NO-POPCOUNT-NEXT: movl %eax, %ecx
84
+ ; X64-NO-POPCOUNT-NEXT: shrl $20, %ecx
85
+ ; X64-NO-POPCOUNT-NEXT: shrl $19, %eax
86
+ ; X64-NO-POPCOUNT-NEXT: subl %ecx, %eax
93
87
; X64-NO-POPCOUNT-NEXT: retq
94
88
%mask = and i32 %x , 1572864 ; 3 << 19
95
89
%count = tail call i32 @llvm.ctpop.i32 (i32 %mask )
0 commit comments