ARM Neon Assembler - работа с переполненными регистрами - PullRequest
2 голосов
/ 08 марта 2012

Я хочу сделать следующее: У меня есть 8 значений (8 х 1 байт) в неоновом D-регистре (= 64 бит). Теперь мне нужно сдвинуть каждое значение 3 влево, но я не хочу терять биты. После этого мне нужно добавить к каждому значению в векторе одно и то же значение 32Bit.

Как я понял, я могу использовать инструкцию VQSHL , чтобы поместить результат в 2 D-регистра, если он переполнится? Как я узнаю, что произошло переполнение, и гарантирую / заставлю все мои данные быть в новых регистрах?

Также не могли бы вы помочь мне с кодом для сдвига и добавить часть?

Пример кода:

out0 = CONSTANT_32BIT + (input0 << 3) </p>

out1 = CONSTANT_32BIT + (вход1 << 3) </p>

out_n = CONSTANT_32BIT + (input_n << 3) </p>

Итак, теоретически я мог бы выполнять 8 или 16 из этих инструкций параллельно, используя неоновые регистры?

Цель - ARM Cortex-A9, если это важно.

Ответы [ 2 ]

3 голосов
/ 08 марта 2012

Вы могли бы сделать что-то вроде этого (непроверенный код, но должен дать вам некоторое представление о том, как это сделать):

//Assumes signed ints
//d0: 8 input bytes
//q3: contains four copies of the 32-bit constant
//Perform shift and extend to 16-bit elements
vshll.s8 q0, d0, #3
//Extend 16-bit elements to 32-bit elements and add the 32-bit constants
vaddw.s16 q1, q3, d0
vaddw.s16 q2, q3, d1
//q1 now contains first four values, q2 the last four
2 голосов
/ 08 марта 2012

VQSHL - насыщающий сдвиг. То есть, он не позволит переполнению дорожек, и если они это сделают, они будут насыщаться до максимально возможного значения. Если это желаемое поведение, то это будет работать для вас. Если произошло насыщение, процессор установит FPSCR.QC (флаг накопительного насыщения).

Из вашего описания звучит так, будто вы не хотите переполнения. Если вы планируете добавить 32-битное значение к каждому 8-битному значению, результат обычно не помещается в 8-битный регистр. Возможно, вам следует рассмотреть возможность загрузки ваших 8-битных значений в более широкий регистр. Например. как 4 32-битных дорожки. Вы можете использовать многоэлементную форму VLD, чтобы помочь вам загрузить 8-битные значения в регистры NEON, например, VLD2.8 {d0[0],d1[0],d2[0],d3[0]}, [r0] будет загружать четные индексы, а затем вы можете загружать нечетные. Еще один вариант - использовать VZIP.

...