Я тут с коллегой по работе (тоже программист) недавно обсуждал (ну как недавно - пару лет назад ;~) его гипотетический 64-битный процессор и он предложил одну интересную штуку - сдвигать окно регистров не на заранее определённое кол-во регистров, а на столько, сколько нужно вызванной подпрограмме (возвращая окно назад по ret) - при этом получаем экономию регистров и если физические регистры закончились, то всегда можно вызвать софтовый трап, который будет обрабатывать эту исключительную ситуацию, к примеру сбрасывая старые регистры во внешнюю память...Shaos wrote:Подумалось тут мне, что наверное вместе со скрытым стеком возвратов можно также и окно регистров реализовать (как у некоторых) - чтобы с вызовом подпрограммы оно сдвигалось, сохраняя тем самым регистры вызвавшей программы. Скажем будет это примерно так:
r0 - всегда 0
r1 - глобальный регистр (никогда не сдвигается)
r2 - глобальный регистр (никогда не сдвигается)
r3 - глобальный регистр (никогда не сдвигается)
r4 - глобальный регистр (никогда не сдвигается)
r5 - исчезнет после ret или превратится в r10 после call
r6 - исчезнет после ret или превратится в r11 после call
r7 - исчезнет после ret или превратится в r12 после call
r8 - исчезнет после ret или превратится в r13 после call
r9 - исчезнет после ret как и после call (вызов подпрограммы не должен разрушать флаги)
r10 - превратится в r5 после ret или сохранится после call
r11 - превратится в r6 после ret или сохранится после call
r12 - превратится в r7 после ret или сохранится после call
r13 - превратится в r8 после ret или сохранится после call
r14 - превратится в r9 после ret или сохранится после call (флаги)
r15 - содержит младшие 16 битов текущего PC (старшие 4 скрыты)
При вызове подпрограммы регистры r5-r8 встают на место r10-r13 (при этом старые r10-r14 сохраняются вместе с адресом возврата), а на место r5-r9 встаёт следующее окно. При очередном вызове подпрограммы всё также сдвинется вниз, а при возврате - вверх. Как видно вызывающая программа может проверить флаги подпрограммы в регистре r9, в то же время получив свои сохранённые флаги в r14.
P.S. Как оказалось это похоже на Amd 29000:
https://web.archive.org/web/20070927060927/http://www.amd.com/epd/29k/29kprog/29kprog.pdfThe AMD 29000 improved the design by allowing the windows to be of variable size, which helps utilization in the common case where fewer than eight registers are needed for a call. It also separated the registers into a global set of 64, and an additional 128 for the windows.
P.P.S. Правда у AMD 29000 процесс вызова подпрограммы и возврата из неё выглядит несколько тяжеловато:
http://people.cs.clemson.edu/~mark/subroutines/amd29k.html
Коллега же в своём 64-битном проце просто при входе в подпрограмму предполагал вызывать спецоперацию, которая сдвигает окно на N, а при возврате из подпрограммы возвращает обратно (причём не обязательно на то же самое количество регистров)...
P.P.P.S. Itanium аналогичное регистровое окно переменного размера имеет

http://people.cs.clemson.edu/~mark/subroutines/itanium.html