有没有办法把这个函数中的popcnt指令数减少到一条? 该函数计算位的加权和。
foo:
movq %rdi, %rax
movq %rax, %r8
andq m1, %r8
popcnt %r8, %rcx
movq %rax, %r8
andq m2, %r8
popcnt %r8, %r9
imulq $2, %r9
addq %r9, %rcx
movq %rax, %r8
andq m3, %r8
popcnt %r8, %r9
imulq $4, %r9
addq %r9, %rcx
movq %rax, %r8
andq m4, %r8
popcnt %r8, %r9
imulq $8, %r9
addq %r9, %rcx
movq %rax, %r8
andq m5, %r8
popcnt %r8, %r9
imulq $16, %r9
addq %r9, %rcx
movq %rax, %r8
andq m6, %r8
popcnt %r8, %r9
imulq $32, %r9
addq %rcx, %r9
movq %r9, %rax
ret
我想知道是否有一种方法可以计算一次 popcnt - 从输入数字,然后对该数字执行操作。 我尝试了很多选项,在我看来这里有一个规则可以快速计算,但我没有看到它。