Сам аппаратным синтезом не занимаюсь, но хотелось бы услышать мнение специалистов.
Когда-то я учился программировать микроконтроллеры на архитектуре MCS-51. Оттуда мне запомнилось наличие нескольких банков регистров, переключение между которыми практически бесплатно. Это ж во как здорово для любых видов многозадачности! Не нужно заталкивать регистры в стек, достаточно просто переключиться на другой банк. Я так делал для прерываний.
Но регистров у процессоров всегда очень мало, так что выдавать их банками - непозволительная роскошь. Какому-нибудь конечному автомату их нужно всего три-четыре штуки. Привязывать функции к конкретным номерам регистров - тоже очень неудобно, придется делать для разных регистров разные копии функций.
В связи с этим вопрос - можно ли сделать процессор с относительной адресацией регистров? Ну, чтобы использовать не целый банк, а столько, сколько их нужно, как мы поступаем со стеком? Например, сделать дополнительный регистр r с номером смещения в регистровом файле. Функции тогда будут обращаться не по абсолютному номеру "reg(4)", а по относительному "reg(r + 4)". Когда потребуется сохранить/восстановить контекст, компилятор в зависимости от наличия места в файле либо просто переключит номер регистра (дешево?), либо загрузит файл целиком из стека/памяти и тоже переключит номер. Так, я думаю, можно будет избавиться от большого количества сохранений контекста в стек. Забавно, выглядело бы это как стековый процессор, у которого в роли инструкций функции программы. К тому же, у меня подозрение, что именно так работает многозадачность на современных видеокартах - с аппаратным планировщиком и контроллером памяти, реализующими ту же стратегию. |