Попарное сложение в неоне
Я хочу добавить 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 используются дополнительные инструкции, но компилятор мог бы работать лучше.