Попарное сложение в неоне

Я хочу добавить 00 а также 01 значение индексов int64x2_t вектор в неоне. Я не могу найти инструкцию по парному добавлению, которая будет выполнять эту функцию.

int64x2_t sum_64_2;
//I am expecting result should be.. 
//int64_t result = sum_64_2[0] + sum_64_2[1];
  • Есть ли какая-то инструкция по неону делать с этой логикой.

1 ответ

Вы можете написать это двумя способами. Этот явно использует НЕОН VADD.I64 инструкция:

int64x1_t f(int64x2_t v)
{
  return vadd_s64 (vget_high_s64 (v), vget_low_s64 (v));
}

и следующий полагается на компилятор, чтобы правильно выбирать между использованием NEON и общих целочисленных наборов команд. GCC 4.9 делает правильные вещи в этом случае, но другие компиляторы не могут.

int64x1_t g(int64x2_t v)
{
  int64x1_t r;
  r=vset_lane_s64(vgetq_lane_s64(v, 0) + vgetq_lane_s64(v, 1), r, 0);
  return r;
}

При нацеливании на ARM генерация кода эффективна. Для AArch64 используются дополнительные инструкции, но компилятор мог бы работать лучше.

Другие вопросы по тегам