Re: Генерация машинного кода в компиляторах
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 17.05.23 07:10
Оценка: 124 (3) +1
Здравствуйте, VVVa, Вы писали:

VVV>Не подскажите как компиляторы фиксят проблему неудобного распределения регистров?

VVV>я просто не распределяю регистр eax и когда получается к примеру mov m32,m32 то добавляю
VVV>mov eax,m32
VVV>mov m32,eax
VVV>кстати довольно много приходится писать ...
VVV>а есть ли способ получше?

Ну ты спросил... (c)

Вообще непонятно, о чём конкретно вопрос, поэтому отвечу вширь (и интересно, что ещё скажут).

1. Если про оптимизацию использования — чем больше регистров применено и чем меньше перегонки через память, то это одна из сложнейших проблем, и в полном виде она NP-полная.
На практике используется целая толпа алгоритмов, которые дают более-менее внятный локальный оптимум.
Компиляторы с SSA определяют наиболее часто используемые значения в пределах блоков и циклов и держат их в регистрах, пытаясь забить доступный регистровый пул по максимуму. Без SSA используются более хитрые костыли, которые по сути сводятся к тому же.
https://en.wikipedia.org/wiki/Register_allocation
https://www.geeksforgeeks.org/register-allocation-algorithms-in-compiler-design/
и так далее.
Но для ручного ассемблирования можно применить похожие методы просто вручную, насколько хватит сил — найти самые ходовые значения и их держать в регистрах.

2. Если про специфику конкретных архитектур, то тут сплошные эмпирики, которые нарабатываются годами под конкретные железяки.
Вон писали, что MSVC (до SSA?) старался использовать CX (ECX, RCX...) только как временный или для его специфичных команд (сдвиги).
Наоборот, максимально используя AX можно применять более простые или короткие команды.

Но как правило это сводится к ограничениям (constraintʼам) в обобщённом алгоритме аллокации регистров (ну типа "вот тут обязательно нужен RDI или RSI, выгибайтесь, ребята, как хотите"), а уже он максимально старается применить доступную свободу.

3. Можно скрыть проблему используя макры для 90-95% кода пойдёт, а там, где самые горячие места, открыть их и рассчитать всё вручную...
The God is real, unless declared integer.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.