PowerPC переходит на переменное SPR

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

Моя проблема в том, что синтаксис, который я нашел для перемещения данных из GPR в 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, каждая из которых выглядит совершенно одинаково, но отличается постоянным значением.


person mahju    schedule 13.07.2010    source источник


Ответы (3)


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

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

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

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

person TMN    schedule 13.07.2010
comment
Я полагаю, что должен быть код, который вам не совсем удобен. Я хотел бы сохранить как можно больше кода на C, но я полагаю, что я соглашусь с тем, что у меня есть. Спасибо, в любом случае. - person mahju; 13.07.2010
comment
В динамически генерируемом коде нет ничего плохого, но я думаю, что вы должны пометить страницы как исполняемые и очистить кэш инструкций для соответствующих адресов (icbf?). Однако накладные расходы на очистку кеша, вероятно, того не стоят. - person tc.; 07.04.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;})

#define mtspr(rn, v) asm volatile("mtspr" stringify(rn) ",%0" : : "r" (v))

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

person David Winant    schedule 13.04.2011
comment
Помните, что это работает, только если rn является константой времени компиляции. Вы не можете использовать для этого, например, другой георадар. - person David Given; 16.10.2016

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

person Paul R    schedule 13.07.2010
comment
В настоящее время я делаю именно это. У меня есть огромный переключатель, основанный на перечислении в моем C-коде, который переходит к правильным инструкциям. Как сейчас выглядит, у меня есть куча mtspr-инструкций, которые отличаются только константами. Я был бы гораздо более счастливым программистом, если бы мог избавиться от всего этого кода. - person mahju; 13.07.2010