PowerPC переходит на переменную SPR - PullRequest
3 голосов
/ 13 июля 2010

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

Моя проблема заключается в том, что синтаксис, который я нашел для перемещения данных из георадара в SPR, принимает константуЗначение SPR, в то время как я хочу использовать переменную, которая хранится в другом регистре.

# SPR is constant, rA is the value to be written
mtspr SPR, rA

Я ищу что-то похожее на это:

# rA contains the number of the SPR, and rB the value to be moved.
AWESOMEmtspr rA, rB

Есть ли причина, по которойтакого макроса нет в наличии, и как бы я сделал его сам?

Заранее большое спасибо.

---- Редактировать: ---- Как это выглядит сейчасУ меня есть гигантский случай переключения в моем C-коде, который переходит к правильному mtspr-разделу.У меня есть двадцать несколько разделов для чтения и записи, в которых указаны SPR: они выглядят совершенно одинаково, но отличаются постоянным значением.

Ответы [ 3 ]

4 голосов
/ 13 июля 2010

Причина, по которой вы не можете этого сделать, заключается в том, что архитектура команд не принимает косвенный регистр в качестве режима адресации для параметра регистра.Честно говоря, я никогда не видел такую ​​архитектуру машины, поскольку количество регистров обычно довольно мало, поэтому регистр кодируется как часть самой инструкции.Если вам действительно не нравится решение, которое вы получили, вы можете попытаться самостоятельно синтезировать инструкцию (возьмите базовый код операции, посмотрите, куда идет спецификатор регистра и ИЛИ в соответствующем значении), затем выполните его.В зависимости от вашей ОС и компилятора это может оказаться невозможным (самоизменяющийся код часто запрещен).

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

MTPSR PSRx, val
RET
MTPSR PSRx+1, val
RET

Я не знаю, что для вас считается "чище", просто подумал, что выброслю это.Обратите внимание, что вам, возможно, придется дополнить NOP, чтобы все выровнять, у меня нет руководства по PowerPC, поэтому я понятия не имею, каковы размеры инструкций или требования к выравниванию.

1 голос
/ 14 апреля 2011

Я нашел довольно элегантное решение для этого с помощью макроса stringizer:

# define stringify (s) tostring (s)

# define tostring (s) # s

# define mfspr (rn) ({unsigned int rval; \ asm volatile ("mfspr% 0," stringify (rn) \: "= r" (rval)); rval;})

# определить mtspr (rn, v) asm volatile ("mtspr" stringify (rn) ",% 0":: "r" (v))

Это из U-Bootкод для PowerPC.

0 голосов
/ 13 июля 2010

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

...