Как изменить порядок векторных данных с использованием встроенных ARM Neon?

Это специально связано с кодировкой ARM Neon SIMD. Я использую ARM Neon instrinsics для определенного модуля в видеодекодере. У меня есть векторизованные данные следующим образом:

В регистре Neon есть четыре 32-битных элемента - скажем, Q0 - размер 128 бит.

3B 3A 1B 1A

Есть еще четыре, 32-битные элементы в другом регистре Neon, скажем Q1, размер которого составляет 128 бит.

3D 3C 1D 1C

Я хочу, чтобы конечные данные были в порядке, как показано ниже:

1D 1C 1B 1A
3D 3C 3B 3A

Какие неоновые объекты могут достичь желаемого порядка данных?

Ответ 1

как насчет следующего:

  int32x4_t q0, q1;

  /* split into 64 bit vectors */
  int32x2_t q0_hi = vget_high_s32 (q0);
  int32x2_t q1_hi = vget_high_s32 (q1);
  int32x2_t q0_lo = vget_low_s32 (q0);
  int32x2_t q1_lo = vget_low_s32 (q1);

  /* recombine into 128 bit vectors */
  q0 = vcombine_s32 (q0_lo, q1_lo);
  q1 = vcombine_s32 (q0_hi, q1_hi);

В теории это должно скомпилировать только две команды перемещения, потому что vget_high и vget_low просто переинтерпретируют 128-битные Q-регистры как два 64-битных D-регистра. vcombine otoh просто компилируется на один или два хоста (зависит от распределения регистров).

Oh - и порядок целых чисел в выходе может быть совсем неправильным. Если это так, просто замените аргументы на vcombine_s32.

Ответ 2

Помните, что каждый регистр q состоит из двух d-регистров, например, нижняя часть q0 равна d0 и высокая часть d1. Таким образом, на самом деле, эта операция просто заменяет d0 и d3 (или d1 и d2, это не совсем ясно из вашего представления данных). Существует даже инструкция swap, чтобы сделать это в одной инструкции!

Отказ от ответственности: я не знаю Neon intrinsics (я напрямую код в сборке), хотя я был бы удивлен, если это невозможно сделать с помощью встроенных функций.

Ответ 3

Похоже, вы должны использовать для этого команду VTRN (например, vtrnq_u32).

Ответ 4

Пьер прав.

vswp d0, d3

который будет делать.

@Pierre: Несколько месяцев назад я читал сообщение о NEON в своем блоге. Я был приятно удивлен, что есть кто-то вроде меня - написание ручных оптимизированных ассемблерных кодов, как ARM, так и NEON. Рад вас видеть.