ror в C/C++

Тема в разделе "WASM.ZEN", создана пользователем Asterix, 12 мар 2005.

  1. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    а что в C/C++ нельзя сделать циклический сдвиг одним оператором,

    единственный путь что-ли это

    x = (x >> n)|(x << (размер_операнда - n)); ???
     
  2. Dr.Golova

    Dr.Golova New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2002
    Сообщения:
    348
    Штоли да. Но хороший компилятор С/С++ сворачивает такую комбинацию до циклического сдвига.
     
  3. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Понятно.

    Не очень то это и хорошо, тем более если компилятор не достаточно хорош чтоб преобразовать этот "огород" в ror
     
  4. Chingachguk

    Chingachguk New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    340
    Но хороший компилятор С/С++ сворачивает такую комбинацию до циклического сдвига.



    Можно пример ? ;)
     
  5. SolidCode

    SolidCode New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2002
    Сообщения:
    162
    Адрес:
    Kazakhstan
    Я бы ему inline assembler вставку записал и вперёд.

    На случай, если не догадается.

    Не привык я надеяться на "умность" программ.
     
  6. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
  7. Dr.Golova

    Dr.Golova New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2002
    Сообщения:
    348
    > Можно пример ? ;)



    Востмой интеловский компилятор у меня обычно сворачивал, если компилить под blend процессор. А вот если под P4, то не сворачивает, видимо два сдвига и or таки быстрее чем rol :)



    > inline asm не всегда хорошо работает



    inline asm обычно вышибает напроч всю оптимизацию внутри функции, так что это сомнительное удовольствие я никогда не использую, разве что отдельная naked функция.
     
  8. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Как я понял, оптимизация отключается, когда "вокруг" асмового кода есть высокоуровневые бранчи (if, while, ...) и наоборот - jmp вокруг С блока. Если asm вставка на линейном участке кода, то оптимизация обычно работает. Интерсно что, если оформить asm вставку как отдельную inline функцию и использовать уже её, то проблемы с оптимизатором обычно исчезают.



    А некоторые вещи можно делать за счёт intrinsic вроде __writefsdword() или _BitScanForward(), хотя часть из них поддерживается только 14й версией msvc (2005). И описаны они только в документации к нему, в последнем PSDK их нет.