Вопрос по сборке SPARC

Я хочу написать очень простую процедуру встроенного ассемблера в моей программе на C, которая ничего не делает, кроме установки локальных регистров %l0 - %l7 в разные значения. Я попробовал следующий простой подход:

asm volatile (
    ".text\n\t"
    "mov 0, %%l0             \n\t"
    "mov 1, %%l1             \n\t"
    "mov 2, %%l2             \n\t"
    "mov 3, %%l3             \n\t"
    "mov 4, %%l4             \n\t"
    "mov 5, %%l5             \n\t"
    "mov 6, %%l6             \n\t"
    "mov 7, %%l7             \n\t"
);  

к сожалению, ассемблер говорит: недопустимый операнд для каждой инструкции. Не мог бы кто-нибудь так любезно указать мне, как я могу правильно передать немедленные значения ассемблеру SPARC?

Большое спасибо!

РЕДАКТИРОВАТЬ: Спасибо, Крис, я внес предложенные вами изменения, но компилятор Sparc все еще говорит что-то о недопустимых операндах...


person reinhard    schedule 03.03.2011    source источник
comment
Два %% действительно необходимы здесь?   -  person Hans Passant    schedule 03.03.2011


Ответы (2)


SPARC не дает инструкций «немедленного движения» как таковых; есть либо or, которая может использоваться как or %g0, 123, %l0 (или создание не более 11-битной константы с нулевым регистром, %g0, что приводит к перемещению указанной константы в целевой регистр), либо инструкция sethi, которую можно использовать для установить верхний 21 бит регистра. Чтобы разместить любую (32-битную) константу, вы должны синтезировать двухшаговый set, выполнив сначала sethi для старших битов, а затем or для младших.

Сборщики SPARC обычно знают сокращение set ..., %tgtregister для создания этой последовательности и/или исключают одну инструкцию, если константа подходит для этого.

Также обратите внимание, что в 64-битной / sparcv9 инструкция set может в конечном итоге оцениваться как последовательность до пяти инструкций, сдвигая/или объединяя вещи вместе.

person FrankH.    schedule 04.03.2011

Вам нужны такие строки, как mov 0, %%l0 -- источник, затем пункт назначения, а константы - это просто константы, без символа «#».

изменить

Если у вас нет ограничений в вашей директиве asm (только строка), то gcc не обрабатывает строку для %-экранирования. Так что в этом случае вам нужно всего лишь одиночные % символа перед именем регистра. Но если вы добавите какие-либо ограничения (или даже просто :: после строки — пустой набор ограничений), он будет искать %-экранирование, поэтому вам нужно %% для имен регистров.

Поэтому либо добавьте :: непосредственно перед ), либо удалите дубликаты символов %.

person Chris Dodd    schedule 03.03.2011