ARM NEON: сравнение 128-битных значений - PullRequest
5 голосов
/ 30 января 2012

Мне интересно найти самый быстрый способ (наименьшее количество циклов) сравнения значений, хранящихся в регистрах NEON (скажем, Q0 и Q3) на ядре Cortex-A9 (разрешены инструкции VFP).

Пока у меня есть следующее:

(1) Использование сравнения с плавающей запятой VFP:

vcmp.f64        d0, d6
vmrs            APSR_nzcv, fpscr
vcmpeq.f64      d1, d7
vmrseq          APSR_nzcv, fpscr

Если 64-битные "плавающие" значения эквивалентны NaN, эта версия не будет работать.

(2) Использование сужения NEON и сравнения VFP (на этот раз только один раз и безопасным для NaN способом):

vceq.i32        q15, q0, q3
vmovn.i32       d31, q15
vshl.s16        d31, d31, #8
vcmp.f64        d31, d29
vmrs            APSR_nzcv, fpscr

В регистр D29 предварительно загружен правильный 16-битный шаблон:

vmov.i16        d29, #65280     ; 0xff00

Мой вопрос: есть ли что-нибудь лучше этого? Я наблюдаю какой-то очевидный способ сделать это?

1 Ответ

2 голосов
/ 31 января 2012

Полагаю, вы можете уменьшить его на одну инструкцию. Используя сдвиг влево и вставку (VLSI), вы можете объединить 4 32-разрядных значения Q15 в 4 16-разрядных значений в D31. Затем вы можете сравнить с 0 и получить флаги с плавающей запятой.

vceq.i32  q15, q0, q3
vlsi.32   d31, d30, #16
vcmp.f64  d31, #0
vmrs      APSR_nzcv, fpscr
...