Программирование для встроенных систем - статьи

Array Index Allocation


И, наконец, алгоритм Array Index Allocation позволяет оптимизировать циклические доступы к массиву. К примеру, данный цикл: for(int i=0;i<10;i++) { a[i]; a[i+1]; }

Может быть приведен к следующему виду:

ptr = a; for(int i=0;i<10;i++) { ptr++; ptr; }

Таким образом, мы перешли от операции косвенной адресации a[i+1], к индексному регистру с автоувеличением ptr++, сэкономив на операции косвенной адресации. Для того чтобы эта оптимизация была возможна, необходимо «протаскивать» информацию о доступах к массиву и о циклах.

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

Подробнее о реализации приведённых здесь преобразований в SPAM см. [6].



Содержание раздела