Распределение регистров процессора

Процессоры, на базе которых строятся современные вычислительные системы, имеют, как правило, несколько программно-доступных регистров. Часть из них может быть предназначена для выполнения каких-либо определенных целей (на­пример, регистр — указатель стека или регистр — счетчик команд), другие могут быть использованы практически произвольным образом при выполнении раз­личных операций (так называемые «регистры общего назначения»).

Использование регистров общего назначения для хранения значений операндов и результатов вычислений позволяет добиться увеличения быстродействия про­граммы, так как действия над регистрами процессора всегда выполняются быст­рее, чем над ячейками памяти. Кроме того, в ряде процессоров не все операции могут быть выполнены над ячейками памяти, а потому часто требуется предва­рительная загрузка операнда в регистр. Результат выполнения операции чаще всего тоже оказывается в регистре, и если необходимо, его надо выгрузить (запи­сать) в ячейку памяти.

Программно доступных регистров процессора всегда ограниченное количество. Поэтому встаёт вопрос об их распределении при выполнении вычислений. Этим занимается алгоритм распределения регистров, который присутствует практиче­ски в каждом современном компиляторе в части генерации кода результирую­щей программы.

При распределении регистров под хранение промежуточных и окончательных ре­зультатов вычислений может возникнуть ситуация, когда значение той или иной переменной (связанной с нею ячейки памяти) необходимо загрузить в регистр для дальнейших вычислений, а все имеющиеся доступные регистры уже заняты. Тогда компилятору перед созданием кода по загрузке переменной в регистр не­обходимо сгенерировать код для выгрузки одного из значений из регистра в ячейку памяти (чтобы освободить регистр). Причем выгружаемое значение за­тем, возможно, придется снова загружать в регистр. Встает вопрос о выборе того регистра, значение которого нужно выгрузить в память.

При этом возникает необходимость выработки стратегии замещения регистров процессора. Как правило, стратегии замещения регистров про­цессора предусматривают, что выгружается тот регистр, значение которого будет использовано в последующих операциях позже всех (хотя не всегда эта страте­гия является оптимальной).

Кроме общего распределения регистров могут использоваться алгоритмы рас­пределения регистров специального характера. Например, во многих процессо­рах есть регистр-аккумулятор, который ориентирован на выполнение различных арифметических операций (операции с ним выполняются либо быстрее, либо имеют более короткую запись). Поэтому в него стремятся всякий раз загрузить чаще всего используемые операнды; он же используется, как правило, при пере­даче результатов функций и отдельных операторов. Могут быть также регистры, ориентированные на хранение счетчиков циклов, базовых указателей и т. п. Тогда компилятор должен стремиться распределить их именно для тех целей, на вы­полнение которых они ориентированы.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: