62
Например, в архитектуре ARM по соглашению о вызовах параметры в
функцию передаются через 4 регистра: R0, R1, R2, R3. Поэтому инструкции
передачи аргументов в функцию транслируются через копирование значений из
виртуального регистра в соответствующий реальный программный код.
После фазы выбора инструкций осуществляется фаза распределения
регистров, позволяющая заменить виртуальные регистры реальными.
Между этими двумя фазами добавляется оптимизация по планированию
инструкций. Она позволяет реализовать алгоритм списочного планирования
(list scheduling). В состав оптимизации входит граф зависимости между
инструкциями с назначением их весов. После этого планировщик на основании
модели процессора формирует несколько инструкций. Для этого на каждом
такте формируется список доступных инструкций, у которых вычисление всех
аргументов завершилось. Далее из этого списка планировщиком выбирается
необходимое количество инструкций, имеющих наивысший приоритет.
Приведем пример процесса оптимизации на модели процессора ARM
Cortex-A8. На этом процессоре отсутствует аппаратное переупорядочивание
инструкций. Поэтому эффект от планирования будет существенным.
В процессорах Cortex-A8 находится 2 конвейера. Если между
инструкциями на разных конвейерах существует зависимость, то это приводит
простою конвейера.
В архитектуре ARM существует возможность адресации 16 регистров
общего назначения, при этом 4 регистра будут включать R15 - счетчик команд,
R14 - адрес возврата, R13 - указатель стека, R8 для адресации внутренних
данных программы Valgrind.
Кроме этого, регистры R0 и R3 будут участвовать в соглашении других
вызовов. Остальные 8 регистров будут использоваться произвольным образом.
Поскольку количество свободных регистров ограничено, то слишком
агрессивное переупорядочивание будет приводить к сбросу регистров памяти и
негативно отражаться на производительности программного обеспечения.