Size: a a a

2020 August 24

r

red75prime in rust_offtopic
Constantine Drozdov
не думаю, что трансляцию из LLVM в команды CPU можно верифицировать, это решение эквивалентности программ
Невозможно доказать эквивалентность произвольных программ. Построить функцию, которая доказанно выдаёт на выходе семантически эквивалентный код должно быть возможно.
источник

CD

Constantine Drozdov in rust_offtopic
red75prime
Невозможно доказать эквивалентность произвольных программ. Построить функцию, которая доказанно выдаёт на выходе семантически эквивалентный код должно быть возможно.
Нас интересует не семантически эквивалентный код, а доказательство эквивалентности конкретного кода
источник

CD

Constantine Drozdov in rust_offtopic
например, x = 0 и xor eax, eax
источник

CD

Constantine Drozdov in rust_offtopic
mov eax, 0 нас не устраивает
источник

r

red75prime in rust_offtopic
Constantine Drozdov
Нас интересует не семантически эквивалентный код, а доказательство эквивалентности конкретного кода
Этот код получен определенным образом. Последовательным применением трансформаций, например. Можно доказать, что преобразование, удаляющее первую часть из последовательности операций вида x=1; x=2;, сохраняет семантику. Используем только такие доказанные преобразования. Получаем доказанно эквивалентную программу.
источник

CD

Constantine Drozdov in rust_offtopic
red75prime
Этот код получен определенным образом. Последовательным применением трансформаций, например. Можно доказать, что преобразование, удаляющее первую часть из последовательности операций вида x=1; x=2;, сохраняет семантику. Используем только такие доказанные преобразования. Получаем доказанно эквивалентную программу.
На нижнем уровне доказываем, что
        mov     rcx, QWORD PTR [rbp-8]
       movabs  rdx, 35958565445827586
       mov     rax, rcx
       imul    rdx
       mov     rsi, rcx
       sar     rsi, 63
       mov     rax, rdx
       sub     rax, rsi
       mov     rdx, rax
       sal     rdx, 9
       add     rdx, rax
       mov     rax, rcx
       sub     rax, rdx
эквивалент знакового деления i64 на 513
источник

r

red75prime in rust_offtopic
Было бы неплохо. Говорят ошибки в оптимизации деления компиляторами встречались довольно часто.
источник
2020 August 25

EG

Emmanuel Goldstein in rust_offtopic
Constantine Drozdov
На нижнем уровне доказываем, что
        mov     rcx, QWORD PTR [rbp-8]
       movabs  rdx, 35958565445827586
       mov     rax, rcx
       imul    rdx
       mov     rsi, rcx
       sar     rsi, 63
       mov     rax, rdx
       sub     rax, rsi
       mov     rdx, rax
       sal     rdx, 9
       add     rdx, rax
       mov     rax, rcx
       sub     rax, rdx
эквивалент знакового деления i64 на 513
Деление реально компилируется в такой треш?
источник

CD

Constantine Drozdov in rust_offtopic
Emmanuel Goldstein
Деление реально компилируется в такой треш?
Треш?
источник

EG

Emmanuel Goldstein in rust_offtopic
Была, вроде как, встроенная инструкция div для таких случаев
источник

EG

Emmanuel Goldstein in rust_offtopic
Это, правда, unsigned
источник

EG

Emmanuel Goldstein in rust_offtopic
Но есть idiv
источник

EG

Emmanuel Goldstein in rust_offtopic
И сложно поверить, что вот эта вот куча математических операций быстрее, чем одна инструкция
источник

EG

Emmanuel Goldstein in rust_offtopic
https://godbolt.org/z/jzf976
Реально не idiv, но и кода гораздо меньше
источник

b

badtrousers in rust_offtopic
Emmanuel Goldstein
И сложно поверить, что вот эта вот куча математических операций быстрее, чем одна инструкция
ты просто не выкупаешь сложность этой инструкции
источник

b

badtrousers in rust_offtopic
div это очень дорого
источник

EG

Emmanuel Goldstein in rust_offtopic
Не настолько же.
И, как показывает godbolt, реальные компиляторы генерируют код вдвое короче этой портянки.
источник

b

badtrousers in rust_offtopic
тут согласен
источник

EG

Emmanuel Goldstein in rust_offtopic
А почему, собственно, в процессоре есть встроенные инструкции, которые дороже, чем их софтварная эмуляция? ELI5
источник

EG

Emmanuel Goldstein in rust_offtopic
Казалось бы, их можно было бы «хардварно» эмулировать на самом проце
источник