3

我需要做一些位操作:从64 位寄存器中的i -th 获取k位,其中 9 ≤ k ≤ 12。k可能会根据我们读取的值而变化,i从 MSB 开始计数并以k递增每次阅读后。(ik只需要描述任务,它们都不必在最终解决方案中)

我想出的最简单的解决方案在 C 语言中是这样的:

uint32_t result = ((n << i) >> (64 - k));

我想知道是否有更好的方法(尤其是在性能方面)来做同样的事情。例如,我发现 BEXTR 汇编指令可以完全满足我的需要。

它会工作得更快吗?或者也许有更好的方法来完成所有这些?

我不确定将它放在我的单个处理器上是否就足够了,因此问题更多的是关于在微码中优化了多少指令

更新。1 Nate Eldredge给出了精彩的参考:uops.info

更新。2 JesterPeter Cordes提出了使用shrx+bzhi

4

0 回答 0