а что в C/C++ нельзя сделать циклический сдвиг одним оператором, единственный путь что-ли это x = (x >> n)|(x << (размер_операнда - n)); ???
Понятно. Не очень то это и хорошо, тем более если компилятор не достаточно хорош чтоб преобразовать этот "огород" в ror
Я бы ему inline assembler вставку записал и вперёд. На случай, если не догадается. Не привык я надеяться на "умность" программ.
MSVC поддерживает: _rotl, _rotl64, _rotr, _rotr64 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib /html/_crt__rotl.2c_._rotr.asp inline asm не всегда хорошо работает :-(
> Можно пример ? Востмой интеловский компилятор у меня обычно сворачивал, если компилить под blend процессор. А вот если под P4, то не сворачивает, видимо два сдвига и or таки быстрее чем rol > inline asm не всегда хорошо работает inline asm обычно вышибает напроч всю оптимизацию внутри функции, так что это сомнительное удовольствие я никогда не использую, разве что отдельная naked функция.
Как я понял, оптимизация отключается, когда "вокруг" асмового кода есть высокоуровневые бранчи (if, while, ...) и наоборот - jmp вокруг С блока. Если asm вставка на линейном участке кода, то оптимизация обычно работает. Интерсно что, если оформить asm вставку как отдельную inline функцию и использовать уже её, то проблемы с оптимизатором обычно исчезают. А некоторые вещи можно делать за счёт intrinsic вроде __writefsdword() или _BitScanForward(), хотя часть из них поддерживается только 14й версией msvc (2005). И описаны они только в документации к нему, в последнем PSDK их нет.