Сообщение 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 ?
Просто использовать не получится. Важное свойство этой инструкции:
И это задача того, кто написал инструкцию div, следить, чтобы её аргументы не вызывали переполнения.
Вот функция ___udivdi3 этим примерно и занимается — вызывает деление безопасным образом, чтобы результат получился именно тем, что написан в С++ коде.
M>на x32 платформе компилирую через gcc v10
Вообще, при делении на константу вызывать ___udivdi3 или использовать инструкцию div — тупо.
Все делают умножение на обратное значение, которое для констант считается во время компиляции.
В gcc 11 поправили: https://gcc.godbolt.org/z/Ga8vcPGK4
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 ?
Просто использовать не получится. Важное свойство этой инструкции:
И это задача того, кто написал инструкцию div, следить, чтобы её аргументы не вызывали переполнения.
Вот функция ___udivdi3 этим примерно и занимается — вызывает деление безопасным образом, чтобы результат получился именно тем, что написан в С++ коде.
M>на x32 платформе компилирую через gcc v10
Вообще, при делении на константу вызывать ___udivdi3 или использовать инструкцию div — неоптимальный вариант, если оптимизируется именно скорость работы (а не размер кода, например).
Все делают умножение на обратное значение, которое для констант считается во время компиляции.
В gcc 11 поправили: https://gcc.godbolt.org/z/Ga8vcPGK4
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