【发布时间】:2010-12-31 07:07:33
【问题描述】:
我想在 Mac 上使用 bts 和 bt x86 汇编指令来加快我的 C++ 代码中的位操作。在 Windows 上,_bittestandset 和 _bittest 内部函数运行良好,并提供显着的性能提升。在 Mac 上,gcc 编译器似乎不支持这些,所以我尝试直接在汇编程序中进行。
这是我的 C++ 代码(注意“位”可以 >= 32):
typedef unsigned long LongWord;
#define DivLongWord(w) ((unsigned)w >> 5)
#define ModLongWord(w) ((unsigned)w & (32-1))
inline void SetBit(LongWord array[], const int bit)
{
array[DivLongWord(bit)] |= 1 << ModLongWord(bit);
}
inline bool TestBit(const LongWord array[], const int bit)
{
return (array[DivLongWord(bit)] & (1 << ModLongWord(bit))) != 0;
}
以下汇编代码有效,但不是最佳的,因为编译器无法优化寄存器分配:
inline void SetBit(LongWord* array, const int bit)
{
__asm {
mov eax, bit
mov ecx, array
bts [ecx], eax
}
}
问题:如何让编译器围绕 bts 指令进行全面优化?以及如何用 bt 指令替换 TestBit?
【问题讨论】:
-
不是直接的答案,只是指向 cims.nyu.edu/cgi-systems/… Extended Asm 文档的链接。
-
由于疯狂的 CISC 语义,带有内存操作数的
BT*很慢。让编译器发出您使用此代码获得的移位/或(或 TEST)指令序列实际上更快。 (至少,这是一个修正错误的 64 位干净版本)。
标签: c++ performance macos gcc assembly