Использование сохраненных регистров в основной функции на ассемблере RISC-V

Предположим, что следующая простая основная функция написана на языке RISC-V Assembly:

.globl main main: addi s3,zero,10 #Should this register (s3) be saved before using?

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

Мой вопрос: следует ли сохранять регистры этих типов каждый раз перед каждым использованием, даже если это означает написание дополнительного (избыточного) кода только для соблюдения соглашений о вызовах? Можно ли иногда игнорировать эти соглашения для повышения производительности?

В приведенном выше примере следует ли сохранять регистр, потому что неизвестно, использовал ли главный вызывающий регистр s3?

Да, их нужно сохранять каждый раз, даже если для этого потребуется больше кода. Да, вызывающий main (например, код инициализации libc) может использовать s3 для своих собственных целей.   —  person zach    schedule 11.06.2021

Источник: ledsshop.ru

Стиль жизни - Здоровье!