Сабж
/* DISCLAIMER:
* I'm aware of "magic constants" in this file,
* but they stay here because of strange gcc behaviour:
*
* return val >> n | val << (32 - n);
*
* unrolls to
*
* mov eax, DWORD PTR [rbp-8]
* mov edx, DWORD PTR [rbp-4]
* mov ecx, eax
* ror edx, cl ← fast ror here
* mov eax, edx
*
* (x86-64 gcc 5.3, -O0),
*
* but
*
* return val >> n | val << (sizeof(val) * 8 - n);
*
* unrolls to
*
* mov eax, DWORD PTR [rbp-8] ─┐
* mov edx, DWORD PTR [rbp-4] │
* mov esi, edx │
* mov ecx, eax │
* shr esi, cl │
* mov eax, 32 ├─ no ror
* sub eax, DWORD PTR [rbp-8] │
* mov edx, DWORD PTR [rbp-4] │
* mov ecx, eax │
* sal edx, cl │
* mov eax, edx │
* or eax, esi ─┘
*/
Пруф: https://godbolt.org/g/rMdXMF
Да, на -O0, но очень часто приходится собирать в debug для прод-узлов, а там -O0. SHA1 сильно базируется на rol, для отладки нужна дебажная инфа, файлы чекаются по 200+ ГБ, тут каждая секунда уже помогает.