Выполните горизонтальную логическую / побитовую операцию И на всех дорожках неонового вектора uint8x8
252 просмотра
2 ответа
У меня есть uint8x8
неоновый вектор, который является результатом какой-то операции. Мне нужно выполнить логическую AND
операцию на всех дорожках, чтобы получить мой конечный результат. Каждый элемент имеет значение 0xff
(ИСТИНА) или 0x00
(ЛОЖЬ). Как мне выполнить это в Неоне?
Ответы (2)
1 плюс
Простой / очевидный метод (псевдокод):
v = VAND(v, v >> 8)
v = VAND(v, v >> 16)
v = VAND(v, v >> 32)
3 x сдвига и 3 x побитовых AND = 6 инструкций.
Возможно, более эффективный метод: сделать горизонтальную сумму всех элементов, а затем вернуть
TRUE
if sum == -8
, иначе вернуть FALSE
.
Возможно, более простой метод: просто сравните вектор с вектором всех 1.
return v == 0xffffffffffffffff;
Эффективное выполнение этого задания оставлено читателю в качестве упражнения (может потребоваться сравнение 2 x 32 бита?).
Автор: Paul R Размещён: 24.10.2017 09:181 плюс
В этом случае вы можете просто выполнить двоичное отрицание и проверить, равен ли 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Вопросы из категории :
- arm Looking for an efficient integer square root algorithm for ARM Thumb2
- arm Как инструкции отличаются от данных?
- arm выравнивание памяти в структурах gcc
- arm Как использовать инструкцию MOV в ARM с непосредственным номером в качестве второго операнда
- arm Симулятор ARM в Windows
- arm Как работать со строками в ARM?
- simd Насколько ускорились преобразования 3D-математики в SSE или другие SIMD?
- simd Как векторизовать с GCC?
- simd Как определить, выровнена ли память?
- simd Как вычислить произведение векторной точки с помощью встроенных функций SSE в C
- simd Как переместить 128-битные немедленные в регистры XMM
- simd Является ли переменная __m128i нулевой?
- neon ffmpeg для Android: неоновая сборка имеет перемещение текста
- neon ARM/neon memcpy optimized for *uncached* memory?
- neon Как помешать GCC взломать мою природу NEON?
- neon переупорядочение значений в 128-битном векторе в коде сборки arm neon
- neon Доступ к половине регистра в расширенной SIMD AArch64
- neon можно ли использовать встроенный неоновый код a32 на iphone6 (т.е. на машине A64)?