На некоторые определения ответить четко ...
NEON имеет 32 регистра, шириной 64 бита (двойное представление как 16 регистров, шириной 128 бит).
Блок NEON может просматривать тот же банк регистров, что и:
- шестнадцать 128-битных регистров четверного слова, Q0-Q15
- тридцать два 64-битных регистра двойного слова, D0-D31.
uint16x8_t
- это тип, для которого требуется 128-битное хранилище, поэтому он должен находиться в регистре quadword
.
В ARM NEON Intrinsics есть определение vector array data type
в языке ARM® C Расширения:
... для использования в операциях загрузки и сохранения, в операциях поиска по таблицам и в качестве результата операций, возвращающих пару векторов.
Инструкция по vzip
... чередует элементы двух векторов.
vzip Dd, Dm
и имеет внутренний, например
uint8x8x2_t vzip_u8 (uint8x8_t, uint8x8_t)
из них мы можем заключить, что uint8x8x2_t на самом деле является списком из двух случайных пронумерованных регистров двойного слова, потому что инструкции vzip не имеют никаких требований к порядку входных регистров.
Теперь ответ ...
uint8x8x2_t
может содержать два непоследовательных регистра двойного слова, а uint16x8_t
- это структура данных, состоящая из двух последовательных регистров двойного слова, первый из которых имеет четный индекс (D0-D31 -> Q0-Q15).
Из-за этого вы не можете преобразовать vector array data type
с двумя регистрами двойного слова в регистр четверного слова ... легко.
Компилятор может быть достаточно умен, чтобы помочь вам, или вы можете просто принудительно преобразовать, но я бы проверил полученную сборку на правильность и производительность.
person
auselen
schedule
06.12.2012