Можно ли заставить GCC выводить точные побитовые инструкции, которые я даю, без встроенной сборки? - PullRequest
0 голосов
/ 19 марта 2019

Я написал код, который выглядит так:

char* xor_and_print(byte arr[], size_t buffSize, byte key)
{
    size_t i;

    for(i = 0; i < buffSize; i++)
    {
        printf("%c", (arr[i] & ~key) | (key & ~arr[i]));
    }
    putchar('\n');
}

Это операция xor, превращенная в дополнительные инструкции. Я использую gcc-6.3.0. Даже когда я компилирую с флагом -O0, gcc превращает это в одну инструкцию xor в разборке. Можно ли заставить его написать эти конкретные инструкции asm с флагом или я должен использовать встроенный язык ассемблера?

1 Ответ

2 голосов
/ 19 марта 2019

Использование volatile должно избежать этой оптимизации:

for(i = 0; i < buffSize; i++)
{
    byte volatile b = arr[i];
    printf("%c", (b & ~key) | (key & ~b));
}

Но он останется неоптимизированным и для более высоких уровней оптимизации.

...