Приведем некоторые из самых общих процедур этой категории.
1. Замена универсальных инструкций учитывающими конкретную ситуацию, например замена команды
умножения на степень двойки на команды сдвига.
Уменьшение числа передач в программе: вследствие преобразования подпрограмм в макрокоманды
для прямого включения в исполнимый код; за счет
преобразования условных переходов, так, чтобы
условие перехода было истинным относительно реже,
чем причины для его отсутствия; перемещение условий общего характера к началу разветвленной последовательности переходов; изменение вызовов, сразу
после чего происходит возврат в программу, в переходы и т. д.
2. Оптимизация циклов, в том числе сдвиг вычислений неизменяющихся величин за границы циклов,
разворачивание циклов и «соединение» отдельных
циклов, выполняемых одно и то же количество раз,
в единый цикл («сжатие цикла»).
3. Наибольшее применение всех доступных регистров,
в результате хранения в них рабочих значений каждый
раз, когда это возможно, чтобы уменьшить число обращений к памяти, упаковка большого числа значений или
флагов в регистры и устранение лишних продвижений
стека (особенно на входах и выходах подпрограмм).
4. Применение специфических для этого процессора инструкций, например, инструкции засылки в стек
прямого значения или умножения числа на непосредственный операнд, имеющийся в процессорах
80186, 80188, 80286, 80386 и 80486. Также примером могут быть двухсловные строковые инструкции, команды перемножения 32-разрядных чисел
и деления 64-разрядного на 32-разрядное число, которые проводятся в процессорах 80386 и 80486. Программа должна, конечно, первоначально определять,
с каким типом процессора она работает.
В процессорах 80 x 86, но не 80 x 88, возможно, удастся повысить скорость действия программы на несколько
процентов в результате выравнивания расположения
данных и меток, на которые осуществляется передача
управления, относительно определенных границ.
Процессоры 8088 и 80188 имеют 8-разрядную
шину, и для них не имеет значения, на какую границу
выровнены данные, поэтому выравнивание можно не
применять или установить на границу байта (1 байт,
8 бит); процессоры 8086, 80186 и 80286 обладают 16-
разрядной шиной, и им проще действовать с данными,
выровненными на границу слова (2 байта, 16 бит); процессор 80386, для которого свойственна 32-разрядная шина, использует выравнивание на границу двойного слова (4 байта, 32 бита); из-за особенностей
своей внутренней кэш-памяти процессору 80486, то
же с 32-разрядной шиной, проще работать, если осуществляется выравнивание на границу параграфа (16
байт, 96 бит).