з апа-рат-ною реалізацією МП. Ці комбінації ко-манд описуються окремо, разом із ни-ми визначається засіб розв’язання цієї проблеми. Таких винятків небагато, але для кожного потрібно вставляти певну процедуру в генератор коду.
Розглянуті таблиці описують ви-нят-ково схемотехніку цільового МП. Настроювання і таблиці порад опи-су-ють поведінку компілятора за певних умов опрацювання ієрархічного графа.
Настроювання і таблиці порад генератора коду
Умовно всі настроювання і таб-ли-ці порад поділяються на декілька класів:
складні експертні правила з перетвореннями і таблицями;
загальні змінні, що визначають конкретні характеристики, необхідні для генерації коду;
ланцюжки операцій (макроси) — інтелектуальні реакції на певні опи-си в ієрархічному графі.
Складні експертні правила. Дея-кі обмеження неможливо описати за до-помогою таблиць або значень конс-тант. Набагато ефективніше реалі-зу-ва-ти їх підтримуваною в системі мовою, в даному випадку мовою Форт. Пере-ва-га полягає в тому, що правила опи-су-ються не спеціально розробленою мо-вою (обмеженою версією якоїсь МВР), а повнофункціональною мовою прог-ра-му-вання. Користувачеві доступні сис-тем-ні бібліотеки Форт та інтерфейс
з Windows. Використана версія Форт
спе-ціально адаптована під слов'янські мови, що дозволяє при настроюванні застосовувати ідентифікатори націо-наль-ною мовою.
Наведемо приклад застосування експертного правила. У багатьох МП
є інструкції інкремента або декремен-та на 1, 2, 4. При записі МВР така опе-ра-ція має вигляд A?A?Const, але
в спис-ку команд процесора в команді інкре-мен-та числова константа не фігурує і не повинна розглядатися при генерації коду. Проте команда A?A?3 не є командою інкремента. Тому можна накласти на константу інк-ремента об-ме-ження, подане функцією, якій конс-танта передається як ар-гу-мент і яка повертає булеве значення як результат. Наприклад, якщо до-пус-каються конс-тан-ти 1 або 1; 2, ці слова мають вигляд
: інкр-конст? ( ч --- помітка) 1 = ;
: інкр-конст? ( ч --- помітка) dup 2 = swap 1 = OR ;
Крім функцій до складу екс-перт-них правил входять різноманітні таб-ли-ці команд-винятків, що мають особливі формати (команди з безпосередніми опе-рандами, фіктивними операндами), команди перетворення типів (пере-тво-рен-ня цілого в покажчик) і т.ін.
Загальні змінні визначають "па-ра-дигму" генерації коду. Вони не описують архітектуру цільового МП, але визначають, як генератор коду по-ви-нен користуватися даним МП. На-ве-демо приклади груп змінних та опи-су-ва-них ними параметрів.
Особливі значення — визна-чен--ня ширини байта в бітах, мак-си-маль-них значень цілих чисел і т.д. — базові значення для архітектури.
Генерація стеків — наявність стеків, регістри кадру та вершини стека.
Особливості конвейєра — ціна предикатної організації коротких гілок оператора "IF", глибина конвейєра при виконанні відкладеного переходу, існу-ван-ня умовних операторів, що можуть виконати команди з різних базових блоків.
Сегмент даних — адресується він за допомогою базового регістра
чи ні.
Генерація оператора циклу — чи є інтегровані команди для опе-ра-то-рів циклів FOR, WHILE, UNTIL, який ре-гістр зберігає поточне значення но-мера ітерації циклу, і т.п.
Спосіб передачі параметрів — скільки параметрів передається у про-це-дуру в регістрах, які регістри ви-ко-рис-товуються, спосіб адресації пара-мет-рів у стеку.
Особливі оцінки — різ-но-ма-ніт-ні дані: винятки у форматах команд, вар-тість вставки у базовий блок функ-ції, засоби адресації, спосіб за-ван-та-жен-ня безпосередніх значень у регіст-ри тощо.
Загальні змінні в більшості ви-пад--ків визначають пове-дін-ку генера-то-ра коду, активізуючи визначені про-це-ду-ри. Ці налагодження в порівнянні з екс-пертними правилами не є інтелек-ту-аль-ними. Але вони описують до 75% загальних випадків генерації коду. Якщо зустрічається особливий випадок генерації коду, що погано визначається описаними засобами, застосовуються пра-вила з явною вказівкою засобу ге-не-рації коду — ланцюжки команд, або макроси.
Ланцюжки команд (макроси). Цей засіб опису застосовується при-найм-ні в трьох випадках: 1) якщо деяка дія, показана в ієрархічному графі як атомна, потребує більше однієї машин-ної команди; 2) якщо деяка операція виз-начається в цільовому МП через ланцюжок команд; 3) при оптимізації деяких функцій ще на стадії компіляції тексту програми МВР в ієрархічний граф. У кожному з перерахованих ви-пад-ків атомна команда замінюється на ланцюжок команд, або макрос. Макрос є функцією, описаною в особливому про-міжному коді. У тілі макроса мож-ливі посилання на вхідні параметри, ре-зультати (яких може бути більше одного) і автоматично виділені локальні змінні. Проміжний код макроса схо-жий на список атомних команд з тією різницею, що він має вищий рівень опису.
Наведемо приклад використання макросів у компіляторі для ADSP-21060. За відсутності адресації по сумі двох регістрів адреси при операціях із струк-турою "масив покажчиків на струк-тури" завантаження адреси з ма-си-ву потребує виконання декількох ко-манд. Наприклад, для коду t[i]^. мовою Pascal потрібно генерувати такі команди:
Rx = DM(0, Iy ); \ ADSP-21060 не може завантажити адресу
Ix = Rx; \ прямо в адресний регістр
Rx = DM(mas1, Ix);
Для опису дії — переміщення регістра в другому рядку компілятору надається макрос, що виглядає так:
:ланцюжок га-3с 2 , 0 , 0 , 3 , 1 ,
в-ланцюжку переміщення ,
_ціле , лн-параметр лн-рег-звілн 1 OR OR ,
р-мереміщення , 0 ,
_покажчик , лн-результат 1 OR ,
в-ланцюжку лн-слово , ' ген-р/с-загр ,
;ланцюжок
В макросі визначається команда типу "переміщення", яка вміст регістра загального призначення з адресою пе-ре-міщує в індексний регістр, а потім здійс-нює генерацію подальшого коду ви-кликом Форт-слова "ген-р/с-загр". Та-ких команд для забезпечення за-ван-та-ження складних типів даних чимало в описі ADSP-21060, тому перші два за-соби інтелектуалізації генерації коду мають занадто малу гнучкість для та-ких завдань.
Макроси успішно вирішують зав-дання генерації коду для тих опе-рацій, для яких немає прямої під-тримки в МП. Так, операції ділення та виз-на-чен-ня квадратного кореня в ADSP-21060 виражаються через опе-ра-ції часткового ділення та часткового квадратного ко-ре-ня, після виконання яких треба ви-ко-нати кілька ітерацій