В любом случае использовать переменную в имени регистра в NEON?

Регистры расширения NEON можно рассматривать как 16 четверных слов или 32 двойных слова. В большинстве программ конкретный используемый регистр является фиксированным. Например,

vmov.i8 d0, 0xff
vmov.i8 d1, 0xee
vmov.i8 d2, 0xdd

В моей задаче количество необходимых регистров двойного слова зависит от аргумента в вызове функции. Например, если аргумент равен 2, мне нужно сделать

vmov.i8 d0, 0xff
vmov.i8 d1, 0xee

Если аргумент равен 4, мне нужно сделать

vmov.i8 d0, 0xff
vmov.i8 d1, 0xee
vmov.i8 d2, 0xdd
vmov.i8 d3, 0xcc

Можно ли как-то выбрать регистр, имя которого основано на переменной? то есть что-то в этой строке (следующее не является допустимым кодом сборки ARM):

mov r0, #1
vmov.i8 d{r0}, 0xff

person windchime    schedule 07.02.2013    source источник
comment
Можете ли вы дать более подробную информацию о том, чего вы пытаетесь достичь здесь? Обычно условия в NEON преобразуются в побитовую логику, поэтому вы можете маскировать части регистра на основе другого значения, выполняя сравнение, за которым следует И (например).   -  person Guy Sirton    schedule 08.02.2013
comment
За редким исключением, инструкции ARM являются статическими, и нет возможности обусловить их операнды.   -  person Variable Length Coder    schedule 08.02.2013
comment
Я пытаюсь выполнить умножение байтовой матрицы. Левая матрица имеет размер 8 на 8 байт, а правая — 8 на n, где n — переменная от 1 до 7. Я хочу посмотреть, смогу ли я написать некоторый общий код для всех возможных n (т. е. вместо того, чтобы сначала выяснить, что n, а затем переходит к метке, которая конкретно имеет дело с этим конкретным значением). Поскольку для разных n требуется разное количество регистров для хранения правильной матрицы, я хочу посмотреть, можно ли определить, какие регистры использовать на основе параметра n.   -  person windchime    schedule 08.02.2013


Ответы (2)


Невозможно выбрать целевой регистр на уровне инструкции, потому что инструкции имеют целевые регистры, жестко закодированные в себе, и невозможно создать самомодифицирующийся код с современными ЦП. См. ARM ARM для любой кодировки инструкций.

Конечно, вы можете сделать это на высоком уровне с помощью if конструкция/условное выполнение разными способами.

person auselen    schedule 08.02.2013

Вы можете выполнить последние две инструкции

vmov.i8 d2, 0xdd
vmov.i8 d3, 0xcc

при условии, что аргумент равен 4.

Вы также можете написать или сгенерировать код для всех возможных значений аргумента.

Возможно, вы также могли бы использовать макросы, если аргумент всегда является константой, а не чем-то вычисляемым.

person Alexey Frunze    schedule 07.02.2013