Используя bts инструкцию по сборке с gcc компилятором

Я хочу использовать 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 купленной инструкцией?

5
задан smartgo 31 December 2009 в 00:29
поделиться

2 ответа

inline void SetBit(*array, bit) {
    asm("bts %1,%0" : "+m" (*array) : "r" (bit));
}
.
4
ответ дан 13 December 2019 в 22:09
поделиться

Еще один немного косвенный ответ, GCC раскрывает ряд атомных операций , начиная с версии 4.1

.
-1
ответ дан 13 December 2019 в 22:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: