2013-03-13 2 views
1

Имея r1, r3 и r4 типа uint32x4_t загруженного в регистры NEON У меня есть следующий код:Неон простой вектор назначения?

r3 = veorq_u32(r0,r3); 
r4 = r1;  
r1 = vandq_u32(r1,r3); 
r4 = veorq_u32(r4,r2); 
r1 = veorq_u32(r1,r0); 

И я был просто интересно, действительно ли переводит GCC r4 = r1 в vmov инструкции. Глядя на разобранный код, я не удивился, что это не так. (более того, я не могу понять, что на самом деле генерирует сгенерированный код сборки)

Сбой с помощью ссылки на NEON по ARM NEON Я не мог найти никакого простого векторного> векторного присвоения intrinsic.

Какой самый простой способ достичь этого? Я не уверен, как будет выглядеть встроенный код сборки, поскольку я не знаю, в каких регистрах были r1 и r4, назначенные vld1q_u32. Мне не нужен фактический обмен, просто назначение.

+0

Как выглядит сборка? вы скомпилировали с -O2? – auselen

+0

Да, есть только куча логических инструкций, но не 'vmov', которого я ожидал бы. – NumberFour

+0

Если вы считаете, что внутренняя функция для вариации инструкции NEON 'vmov' отсутствует, не стесняйтесь публиковать ошибку на http://gcc.gnu.org/ с опкодом, аргументом, ссылкой на документацию и т. Д. – ydroneaud

ответ

3

C имеет концепцию абстрактной машины. Задания и другие операции описаны в терминах этой абстрактной машины. Назначение r4 = r1; говорит присвоить r4 значение r1 в абстрактной машине.

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

В частности, компилятор может не сохранять r1 в том же месте каждый раз. Он может загрузить его из памяти в некоторый регистр R7 при первом его использовании. Но тогда он может реализовать ваше заявление r1 = vandq_u32(r1,r3);, поместив результат в R8, сохраняя исходное значение r1 в R7. Затем, когда у вас будет r4 = veorq_u32(r4,r2);, компилятор может использовать значение в R7, поскольку он все еще содержит это значение, которое r4 будет иметь (из инструкции r4 = r1;) в абстрактной машине.

Даже если вы явно написали внутренний код vmov, компилятор может не выдавать для него инструкцию, если он выдает инструкции, которые получают один и тот же результат в конце.

+0

вы подразумеваете, что код, указанный выше, будет работать, как и ожидалось, однако в распаковке нет инструкции 'vmov'? – NumberFour

+0

@NumberFour: Да. –

Смежные вопросы