Сообщение Re[6]: Как обойти strict aliasing rule? от 18.06.2016 13:08
Изменено 21.06.2016 9:52 S. Schlongberg
Здравствуйте, Erop, Вы писали:
E>А где тут минус
E>и and с чем-то не тем...
E>Тут или какой-то хитрый рюх или 1<<32 не в то посчитался, (лучше, конечно, 1ULL<<32 писать) или ещё чего...
Наверно, потому что имелось в виду
E>>>Ну, например
(В оригинале суффикса ull не было.)
Теперь получается
То есть MSVC вроде как прямолинейно исполняет битовые операции.
Но, что интересно, Clang 3.8 заменяет два независимых сложения на нечто подобное с битовыми операциями:
E>А где тут минус
E>и and с чем-то не тем...
E>Тут или какой-то хитрый рюх или 1<<32 не в то посчитался, (лучше, конечно, 1ULL<<32 писать) или ещё чего...
Наверно, потому что имелось в виду
E>>>Ну, например
a + b - ((1ull<<32)&((a+b)^~(a^b))) И пусть себе там компилятор разбирается, как оптимизировать? (В оригинале суффикса ull не было.)
Теперь получается
mov rax, QWORD PTR [rcx]
mov r8, rax
xor r8, rdx
not r8
lea rcx, QWORD PTR [rax+rdx]
xor r8, rcx
mov rcx, 4294967296 ; 0000000100000000H
and r8, rcx
sub rax, r8
add rax, rdx
ret 0То есть MSVC вроде как прямолинейно исполняет битовые операции.
Но, что интересно, Clang 3.8 заменяет два независимых сложения на нечто подобное с битовыми операциями:
movabs rax, -4294967296
mov rcx, rdi
and rcx, rax
add edi, esi
lea rcx, [rcx + rsi]
and rcx, rax
or rdi, rcx
mov rax, rdi
ret