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

Сообщение Re: gcc и деление от 02.01.2022 1:33

Изменено 02.01.2022 4:39 watchmaker

Re: gcc и деление
Здравствуйте, maks1180, Вы писали:


M>___udivdi3 — очень не быстрая функция которая делает div сдвиги и много чего ещё.

M>Почему просто не использовать div, ведь "div ecx" делит EDX:EAX (64 битное число) на 32-х битное ECX ?

Просто использовать не получится. Важное свойство этой инструкции:

Overflow is indicated with the #DE (divide error) exception

т.е как минимум нормальная работа программы при переполнении закончится и (если нет особого обработчика) будет аварийное завершение.

И это задача того, кто написал инструкцию div, следить, чтобы её аргументы не вызывали переполнения.
Вот функция ___udivdi3 этим примерно и занимается — вызывает деление безопасным образом, чтобы результат получился именно тем, что написан в С++ коде.


M>на x32 платформе компилирую через gcc v10


Вообще, при делении на константу вызывать ___udivdi3 или использовать инструкцию div — тупо.
Все делают умножение на обратное значение, которое для констант считается во время компиляции.
В gcc 11 поправили: https://gcc.godbolt.org/z/Ga8vcPGK4
Re: gcc и деление
Здравствуйте, maks1180, Вы писали:


M>___udivdi3 — очень не быстрая функция которая делает div сдвиги и много чего ещё.

M>Почему просто не использовать div, ведь "div ecx" делит EDX:EAX (64 битное число) на 32-х битное ECX ?

Просто использовать не получится. Важное свойство этой инструкции:

Overflow is indicated with the #DE (divide error) exception

т.е как минимум нормальная работа программы при переполнении закончится и (если нет особого обработчика) будет аварийное завершение.

И это задача того, кто написал инструкцию div, следить, чтобы её аргументы не вызывали переполнения.
Вот функция ___udivdi3 этим примерно и занимается — вызывает деление безопасным образом, чтобы результат получился именно тем, что написан в С++ коде.


M>на x32 платформе компилирую через gcc v10


Вообще, при делении на константу вызывать ___udivdi3 или использовать инструкцию div — неоптимальный вариант, если оптимизируется именно скорость работы (а не размер кода, например).
Все делают умножение на обратное значение, которое для констант считается во время компиляции.
В gcc 11 поправили: https://gcc.godbolt.org/z/Ga8vcPGK4