Использование объединения (инкапсулированного в структуру) для обхода преобразований для неоновых типов данных
Я сделал свой первый подход с векторизацией SSE, где в основном только один тип данных__m128i
, Переходя на Neon, я обнаружил, что типы данных и прототипы функций гораздо более специфичны, например,uint8x16_t
(вектор 16unsigned char
),uint8x8x2_t
(2 вектора с 8unsigned char
каждый),uint32x4_t
(вектор с 4uint32_t
) так далее.
Сначала я был полон энтузиазма (гораздо проще найти точную функцию, работающую с нужным типом данных), затем я увидел, что это за беспорядок, когда я хотел обрабатывать данные по-разному. С помощьюконкретные операторы кастинга взял бы меня навсегда. Проблема также решенаВот, Затем я предложил идею объединения, заключенного в структуру, и некоторые операторы приведения и присваивания.
struct uint_128bit_t { union {
uint8x16_t uint8x16;
uint16x8_t uint16x8;
uint32x4_t uint32x4;
uint8x8x2_t uint8x8x2;
uint8_t uint8_array[16] __attribute__ ((aligned (16) ));
uint16_t uint16_array[8] __attribute__ ((aligned (16) ));
uint32_t uint32_array[4] __attribute__ ((aligned (16) ));
};
operator uint8x16_t& () {return uint8x16;}
operator uint16x8_t& () {return uint16x8;}
operator uint32x4_t& () {return uint32x4;}
operator uint8x8x2_t& () {return uint8x8x2;}
uint8x16_t& operator =(const uint8x16_t& in) {uint8x16 = in; return uint8x16;}
uint8x8x2_t& operator =(const uint8x8x2_t& in) {uint8x8x2 = in; return uint8x8x2;}
};
Этот подход работает для меня: я могу использовать переменную типаuint_128bit_t
как аргумент и вывод с различными неоновыми характеристиками, например,vshlq_n_u32
, vuzp_u8
, vget_low_u8
(в этом случае просто как вход). И я могу расширить его с большим количеством типов данных, если мне нужно. Примечание. Массивы предназначены для простой печати содержимого переменной.
Это правильный путь?
Есть ли скрытый недостаток?
Я заново изобрел колесо?
(Нужен ли выровненный атрибут?)