2013-06-28 3 views
2

Я начинаю изучать руку asm. Теперь интересно, что означают последние «l» в инструкции vmull.u8 q7, d0, d4? Я нашел объяснение здесь VMUL{cond} и Condition codes, объясняющие различные условные выражения, но поскольку последний «l» в vmull отсутствует в списке, я не понимаю, что это значит.Что означает последний L в VMULL на языке ассемблера руки?

ответ

4

«Да»

многосвязной двумя числами с фиксированной точкой дает «длинный» результат двойной длины, и, следовательно, требует двойной ширины регистра для хранения результатов.

So s8 x s8 => s16 результат.

Это технически требуется для любого фиксированной точки умножения для хранения результатов с идеальной точностью, так как умножения два «N» разрядных чисел требует (2 * n) - 1 бит с VMULL для чисел со знаком (2 * n) для знака. Но иногда в арифметике вы работаете только с меньшими целыми числами, и вам не нужны верхние биты, поэтому вы можете использовать VMUL, который быстрее и требует меньше регистров. Иногда при обработке сигналов, если вы представляете некоторый десятичный формат (иногда называемый "Q" numbers), например Q15, используя 16-разрядные номера подписей (s16), тогда вам фактически не нужны нижние битов, а NEON также предоставляет это VQDMLH , Независимо от того, что вам нужно, NEON может это сделать.

+2

На самом деле для умножения без знака вам понадобятся все биты '2 * n'. Максимально возможный продукт оставляет место для еще двух добавлений исходной ширины ('vaddw'), но не, например, сдвиг влево. – sh1

+0

Действительно, спасибо! Я обновил сообщение. –

0

Необязательный код условия применяется в основном режиме Thumb. В режиме ARM единственными условно исполняемыми инструкциями NEON являются те, которые совместно используются с VFP. (VLDM, например)

Видимо вы читаете последнюю версию NEON руководства ARM в (5,03)

По неизвестным причинам, это не хватает все эти длинные, широкие и узкие варианты, которые очень важно ИМО. Возьмите версию ушной раковины, где перечислены все варианты.