Для всестороннего обзора выбора инструкций см. [1] [2]
Макрорасширение
Самый простой подход к выбору инструкций известен как макрорасширение [3] или генерация интерпретативного кода . [4] [5] [6] Селектор макрорасширяющихся инструкций работает путем сопоставления шаблонов по IR среднего уровня. При сопоставлении выполняется соответствующий макрос , используя сопоставленную часть IR в качестве входных данных, которые выдают соответствующие целевые инструкции. Макрорасширение может быть выполнено либо непосредственно на текстовом представлении IR среднего уровня, [7] [8] либо IR может быть сначала преобразовано в графическое представление, которое затем просматривается в глубину. [9] В последнем случае шаблон сопоставляет один или несколько смежных узлов в графе.
Если целевая машина не очень проста, макрорасширение в изоляции обычно генерирует неэффективный код. Чтобы смягчить это ограничение, компиляторы, которые применяют этот подход, обычно объединяют его с оптимизацией peephole , чтобы заменить комбинации простых инструкций более сложными эквивалентами, которые повышают производительность и уменьшают размер кода. Это известно как подход Дэвидсона-Фрейзера и в настоящее время применяется в GCC . [10]
Покрытие графа
Другой подход заключается в том, чтобы сначала преобразовать IR среднего уровня в граф , а затем покрыть граф с помощью шаблонов . Шаблон — это шаблон, который соответствует части графа и может быть реализован с помощью одной инструкции, предоставленной целевой машиной. Цель состоит в том, чтобы покрыть граф таким образом, чтобы общая стоимость выбранных шаблонов была минимизирована, где стоимость обычно представляет собой количество циклов, необходимых для выполнения инструкции. Для древовидных графов покрытие с наименьшей стоимостью может быть найдено за линейное время с помощью динамического программирования , [11] но для DAG и полноценных графов задача становится NP-полной и, таким образом, чаще всего решается с помощью либо жадных алгоритмов , либо методов комбинаторной оптимизации. [12] [13] [14]
Ссылки
^ Блинделл, Габриэль С. Хьорт (2013). Обзор выбора инструкций: обширный и современный обзор литературы (отчет). arXiv : 1306.4898 . ISBN978-91-7501-898-0.
^ Блинделл, Габриэль С. Хьорт (2016). Выбор инструкций: принципы, методы и приложения. Springer. doi :10.1007/978-3-319-34019-7. ISBN978-3-319-34017-3. S2CID 13390131.
^ Браун, П. (1969). «Обзор макропроцессоров». Annual Review in Automatic Programming . 6 (2): 37–88. doi :10.1016/0066-4138(69)90001-9. ISSN 0066-4138.
^ Cattell, RGG (1979). "Обзор и критика некоторых моделей генерации кода" (PDF) . Школа компьютерных наук, Университет Карнеги-Меллона (технический отчет). Архивировано (PDF) из оригинала 23 мая 2019 г.
^ Ганапати, М.; Фишер, КН; Хеннесси, Дж. Л. (1982). «Генерация кода перенацеливаемого компилятора». Computing Surveys . 14 (4): 573–592. doi :10.1145/356893.356897. ISSN 0360-0300. S2CID 2361347.
^ Лунелл, Х. (1983). Системы написания генераторов кодов (докторская диссертация). Линчёпинг, Швеция: Университет Линчёпинга.
^ Амманн, Ю.; Нори, КВ; Дженсен, К.; Нэгели, Х. (1974). «Замечания по реализации компилятора PASCAL (P)». Instituts für Informatik (Технический отчет).
^ Оргасс, Р. Дж.; Уэйт, В. М. (1969). «База для мобильной системы программирования». Сообщения ACM . 12 (9): 507–510. doi : 10.1145/363219.363226 . S2CID 8164996.
^ Уилкокс, ТР (1971). Генерация машинного кода для языков программирования высокого уровня (докторская диссертация). Итака, Нью-Йорк, США: Корнельский университет.
^ Дэвидсон, Дж. В.; Фрейзер, К. В. (1984). «Выбор кода посредством оптимизации объектного кода». Труды ACM по языкам и системам программирования . 6 (4): 505–526. CiteSeerX 10.1.1.76.3796 . doi :10.1145/1780.1783. ISSN 0164-0925. S2CID 10315537.
^ Ахо, А. В.; Ганапати, М.; Тьян, СВК (1989). «Генерация кода с использованием сопоставления деревьев и динамического программирования». Труды ACM по языкам и системам программирования . 11 (4): 491–516. CiteSeerX 10.1.1.456.9102 . doi :10.1145/69558.75700. S2CID 1165995.
^ Wilson, T.; Grewal, G.; Halley, B.; Banerji, D. (1994). «Комплексный подход к генерации перенацеливаемого кода». Труды 7-го Международного симпозиума по высокоуровневому синтезу . С. 70–75. CiteSeerX 10.1.1.521.8288 . doi :10.1109/ISHLS.1994.302339. ISBN978-0-8186-5785-6. S2CID 14384424.
^ Башфорд, Стивен; Лейперс, Райнер (1999). "Выбор кода, управляемого ограничениями, для ЦСП с фиксированной точкой". Труды 36-й конференции ACM/IEEE по автоматизации проектирования - DAC '99 . стр. 817–822. CiteSeerX 10.1.1.331.390 . doi :10.1145/309847.310076. ISBN978-1581331097. S2CID 5513238.
^ Флох, А.; Волински, К.; Кучински, К. (2010). «Комбинированное планирование и выбор инструкций для процессоров с реконфигурируемой фабрикой ячеек». Труды 21-й Международной конференции по прикладным архитектурам и процессорам (ASAP'10) : 167–174.