优化函数中“pocnt”的个数

问题描述 投票:0回答:0

有没有办法把这个函数中的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 - 从输入数字,然后对该数字执行操作。 我尝试了很多选项,在我看来这里有一个规则可以快速计算,但我没有看到它。

assembly x86 arm x86-64
© www.soinside.com 2019 - 2024. All rights reserved.