ARM: лучший способ объединить два регистра, содержащие половинки 32-битного значения, в регистр назначения - PullRequest
0 голосов
/ 13 марта 2012

предположим, у меня есть три значения uint32_t в r0, r1 и r2;предположим, что у меня есть константа shift в диапазоне [0, 32]

Вот код C, который мне нужно сделать:

uint32_t rx = (r0 >> shift) | (r1 << (32 - shift));
uint32_t ry = (r1 >> shift) | (r2 << (32 - shift));

Какие инструкции ARM мне нужно использовать?Мне нужно сделать это только в одной или двух инструкциях.Если shift равно 16, то это легко:

PKHTB  rx, r0, r1
PKHBT  ry, r1, r2

А что если сдвиг равен 8 или 24 битам?По сути, у меня есть невыровненный указатель, и мне нужно прочитать слова из этого невыровненного указателя.Сначала я хочу очистить два младших значащих бита (выровнять их по 4 байта), а затем прочитать слова, используя этот указатель, и сделать некоторую перестановку, чтобы последовательно получить то, что мне нужно, в регистрах.

ПРИМЕЧАНИЕ.не нужны обходные пути или другие предложения.Мне нужно получить слова из невыровненного указателя.Я не могу изменить биты U или A, при чтении без выравнивания происходит сбой приложения.

1 Ответ

1 голос
/ 13 марта 2012

Я думаю, что такие вещи должны работать, хотя я не проверял это:

BFI  rx, r0, #8, #24
BFI  ry, r1, #8, #24
UBFX r1, r1, #24, #8
BFI  rx, r1, #0, #8
UBFX r2, r2, #24, #8
BFI  ry, r2, #0, #8

или

BFI  rx, r0, #24, #8
BFI  ry, r1, #24, #8
UBFX r1, r1, #8, #24
BFI  rx, r1, #0, #24
UBFX r2, r2, #8, #24
BFI  ry, r2, #0, #24

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

Обратите внимание, что некоторые архитектуры ARM делают поддерживают невыровненные нагрузки.

РЕДАКТИРОВАТЬ: Это меня беспокоит. Должен быть лучший способ, и я думаю, что нашел его сейчас:

@ shift is one of {8, 16, 24}
lsr     rx, r0, #\shift
orr     rx, rx, r1, lsl #32-\shift
lsr     ry, r1, #\shift
orr     ry, ry, r2, lsl #32-\shift

r0 может использоваться в качестве регистра назначения вместо rx, то же самое для r1 / ry

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...