Книга: Системное программное обеспечение. Лабораторный практикум

Машинно-зависимые методы оптимизации

Машинно-зависимые методы оптимизации

В качестве дополнительных возможностей в компиляторе, построенном в ходе выполнения примера курсовой работы, реализованы простейшие машинно-зависимые методы оптимизации. Эти методы не претендуют ни на полноту, ни на существенное повышение эффективности результирующей программы, но на их основе можно показать, как выполняется машинно-зависимая оптимизация.

Реализованные методы машинно-зависимой оптимизации основаны на двух особенностях системы команд процессоров типа Intel 80x86 [41, 44]:

1. Особенность загрузки данных в регистр аккумулятора eax.

2. Особенность выполнения арифметических операций.

В первом случае учитывается, что команда загрузки нулевого значения в регистр аккумулятора eax

mov eax, 0

выполняется дольше и имеет большую длину, чем команда очистки регистра eax, которая может быть осуществлена с помощью операций xor (исключающее или) или sub (вычитание) над этим регистром процессора. Например:

xor eax, eax

Поэтому в тех случаях, когда в регистр аккумулятора eax требуется загрузить нулевое значение, генератор ассемблерного кода порождает именно команду очистки регистра. Аналогично, если необходимо загрузить значение, равное 1, то порождается пара команд

xor eax, eax
inc eax

а для значения -1 – пара команд

xor eax, eax
dec eax

Оптимизация загрузки регистра аккумулятора выполняется при порождении результирующего кода. Она реализована в функции MakeMove в модуле TrdAsm (листинг П3.13, приложение 3).

Надо отметить, что эта оптимизация существенно зависит и от целевой вычислительной системы (поскольку она использует особенности системы команд процессоров типа Intel 80x86), и от результирующего языка (например, если бы операндами были однобайтовые величины, эффективность такой оптимизации была бы сомнительна).

Во втором случае учитывается, что при выполнении операций сложения и вычитания в тех случаях, когда один из операндов равен 1 или -1, результирующий код будет более эффективным, если использовать ассемблерные команды увеличения и уменьшения значения регистра на 1 (команды inc и dec):

• для операции сложения порождается команда inc вместо команды add, если один из операндов равен 1;

• для операции сложения порождается команда dec вместо команды add, если один из операндов равен -1;

• для операции вычитания порождается команда inc вместо команды sub, если второй операнд равен -1;

• для операции вычитания порождается команда dec вместо команды sub, если второй операнд равен 1.

Оптимизация арифметических операций также происходит при генерации результирующего кода. Она реализована в функции MakeOpcode в модуле TrdAsm (листинг П3.13, приложение 3).

Надо отметить, что эта оптимизация меньше зависит от целевой вычислительной системы (поскольку практически во всех типах процессоров есть команды, увеличивающие или уменьшающие значение регистра на 1) и совсем не зависит от результирующего языка.

Машинно-зависимые методы оптимизации выполняются компилятором на этапе порождения результирующей программы. Причем функции генерации кода, упомянутые выше, сочетают в себе машинно-зависимую и машинно-независимую оптимизацию.

Оглавление книги


Генерация: 1.327. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз