Я читаю о реализации PIC на MIPS на Linux here. В нем говорится:
Глобальный указатель, который хранится в регистре $ gp (aka $ 28), является зарегистрированным регистром.
Wikipedia article about MIPS говорит то же самое.
Однако в соответствии с ними, когда в функциональном прологе используется директива .cpload
, она сбрасывает предыдущее значение $ gp, не сохраняя его в первую очередь. Когда используется .cprestore
, он сохраняет текущий $ gp в стек стека, в отличие от значения $ gp, которое было там при входе функции. То же самое касается эффекта .cprestore
имеет на jal
/jalr
: он восстанавливает $ gp после возвращения вызываемого абонента - при условии, что вызываемая сторона могла его сбивать.
И, наконец, в функциональном эпилоге нет ничего о $ gp.
В целом, это не звучит как зарегистрированный мной реестр. Звучит как реестр, сохраненный для звонящего. Что я не понимаю здесь?
Итак, в основном, Linux/MIPS ABI отказывается от предложенного вендором соглашения :) Классный. –