значений, как замена add/imul?
Нужно.
а работает ли быстрее, и короче ли выходит по размерам?
Точнее, иногда и быстрее, и короче.
сложение не факт, а умножение только на ряд маленьких констант
Сложение тоже быстрее.
если бы это было так, то компиляторы бы совали её везде подряд, но увы это не так
Потому что они не умеют оптимизировать максимально. У них оптимальная оптимизация. Когда в коде AGU практически не занят - lea просто идеальный вариант для любых вычислений.
как расшифровать AGU?
Address Generation Unit.
возможно, но инструкция lea как раз загрузит этот блок и следующие несколько инструкций придётся использовать обычные, что компиляторы обычно и делают
Ты забываешь, что на современных процессорах этих блоков не 1, и даже не 2. Конкретно ALU и AGU могут достигать даже 8. Так что параллельно 8 независимых LEA процессор за такт точно смогёт выполнить)
ну 8 за такт это не совсем правда, но да, примерно так, в любом случае использовать только одно, не используя другое, глупо
Не, так я же не говорю, что только lea надо. Да и это невозможно, lea достаточно ограниченная инструкция. Но если возможно - надо использовать. А вот про умножение - его брезгуют использовать, зачастую могут использовать sal/sar.
что касается умножения, то его надо использовать, тем более, что инструкции сдивига на некоторых процессорах исполняются столько же сколько умножение
чего действительно стоит избегать, так это деления, оно ужасно медленное
Ты же компилятор в пример приводил, вот я и говорю про них - они постоянно только sar/sal и используют.
На любой.
кстати, sar не про умножение
приведи конкретный пример
поставь 22
Зачем? Он на каждом случае будет разные варианты использовать. Ты попросил пример с sal - я показал. На числа типа 12 он будет его постоянно тыкать. На меньше - будет lea. imul он брезгует использовать.
так ты сказал, что ставит sal на любой код, оказалось это таки не так, хотя действительно лучше во всех случаях умножать
Ты сказал, что он sal вообще не использует, оказалось это не так.
Обсуждают сегодня