Я хочу использовать bts и купленные x86 инструкции по сборке для ускорения битовых операций в моем коде C++ Mac. В Windows _bittestandset и _bittest intrinsics работают хорошо и обеспечивают значительное увеличение производительности. На 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 инструкции? И как я заменяю TestBit купленной инструкцией?
inline void SetBit(*array, bit) {
asm("bts %1,%0" : "+m" (*array) : "r" (bit));
}
. Еще один немного косвенный ответ, GCC раскрывает ряд атомных операций , начиная с версии 4.1
.