Реги́стровое окно́ — один из методов организации работы с регистрами процессора, применяемый для снижения накладных расходов на работу со стеком при вызовах подпрограмм.
Парадигма регистрового окна была разработана в процессе работы над проектом RISC-микропроцессора в Калифорнийском университете в Беркли в 1980—1984 годах.
В подавляющем большинстве процессоров содержится ограниченное количество регистров — ячеек сверхбыстрой памяти, используемых для хранения служебной информации (служебные регистры) и промежуточных результатов работы программ (регистры общего назначения). В традиционной парадигме в момент вызова подпрограммы процессор должен сохранить своё текущее состояние (содержимое большинства служебных регистров и некоторых регистров общего назначения), передать управление на начало процедуры, а после завершения её работы - восстановить ранее сохранённые значения регистров. На практике это означает необходимость записи десятков или сотен байт информации в оперативную память при каждом вызове процедуры.
В парадигме регистрового окна процессорные регистры общего назначения делятся на глобальные регистры (для хранения глобальных переменных) и регистровый файл, не видимый целиком никакой программе.
Пусть регистровый файл состоит из K регистров, расположенных по кругу. Каждой программе доступны лишь L = L1 + L2 + L3 регистров (L < K), составляющих текущее регистровое окно. Окно делится на три части:
Перед вызовом подпрограммы текущая программа записывает в выходные регистры значения параметров, которые необходимо передать в подпрограмму. При передаче управления подпрограмме регистровое окно сдвигается, и выходные регистры предыдущей активной программы становятся для подпрограммы входными. Перед обратной передачей управления подпрограмма записывает результаты (возвращаемые значения) в свои входные регистры. Вызвавшая её программа после обратного смещения регистрового окна будет иметь к ним доступ.[1][2]
Указатель на начало текущего регистрового окна хранится в специальном регистре CWP (Current Window Pointer — указатель текущего окна) и изменяется аппаратно.[3]
В случае, если все регистры оказались задействованы, для вызова очередной подпрограммы значения первых регистров необходимо сохранить в оперативной памяти (действие, аналогичное подкачке страниц).
В классической модели предполагается, что размер регистрового окна фиксирован. В некоторых реализациях (например, в AMD Am29000) используются регистровые окна переменного размера.
Регистровые окна используются в процессорах SPARC, Эльбрус, Intel i960 и AMD Am29000.
Главное достоинство регистровых окон — отсутствие работы со стеком при вызове подпрограмм. Кроме того, регистровые окна реализуют защиту памяти: подпрограмма не может изменить значения большинства регистров вызвавшей её программы. Среди минусов этого подхода можно отметить наличие максимальной глубины вложенности подпрограмм, при превышении которой накладные расходы при вызове подпрограмм резко возрастают. Джон Хеннеси, главный разработчик конкурирующей RISC-архитектуры MIPS, считал, что с задачей поиска свободных регистров для передачи параметров подпрограмме лучше справится компилятор. Выполнение этой работы на аппаратном уровне он считал неоправданным.