Выполните горизонтальную логическую / побитовую операцию И на всех дорожках неонового вектора uint8x8

arm simd neon

252 просмотра

2 ответа

У меня есть uint8x8неоновый вектор, который является результатом какой-то операции. Мне нужно выполнить логическую ANDоперацию на всех дорожках, чтобы получить мой конечный результат. Каждый элемент имеет значение 0xff(ИСТИНА) или 0x00(ЛОЖЬ). Как мне выполнить это в Неоне?

Автор: Lakshmi Источник Размещён: 06.10.2019 12:28

Ответы (2)


1 плюс

Простой / очевидный метод (псевдокод):

v = VAND(v, v >> 8)
v = VAND(v, v >> 16)
v = VAND(v, v >> 32)

3 x сдвига и 3 x побитовых AND = 6 инструкций.


Возможно, более эффективный метод: сделать горизонтальную сумму всех элементов, а затем вернуть TRUEif sum == -8, иначе вернуть FALSE.
Возможно, более простой метод: просто сравните вектор с вектором всех 1.

return v == 0xffffffffffffffff;

Эффективное выполнение этого задания оставлено читателю в качестве упражнения (может потребоваться сравнение 2 x 32 бита?).

Автор: Paul R Размещён: 24.10.2017 09:18

1 плюс

В этом случае вы можете просто выполнить двоичное отрицание и проверить, равен ли 64-битный результат 0.

vmvn d0, d0    
vpaddl.u32 d0, d0 // 64bit vceq isn't possible.
vceq.i32 d0, d0, #0

Теперь у вас есть желаемый результат в d0.

Если вы работаете aarch64, cmeqвозможно 64-битное

mvn v0.16b, v0.16b
cmeq v0.2d, v0.2d, #0

Лучшее в этом алгоритме то, что вам не нужны никакие другие регистры, потому что ноль - это единственное непосредственное значение, принимаемое инструкциями сравнения.

Автор: Jake 'Alquimista' LEE Размещён: 24.10.2017 12:48
Вопросы из категории :
32x32