Информация об изменениях

Сообщение 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>>>Ну, например
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