Согласно моему регулярно используемому источнику Searchable Neon Arm Intrinsic Guide, существуют только эти (четыре класса) встроенные функции для таблицы поиска с 8-байтным целевым регистром (варианты uint8x8 и poly8x8_t для краткости опущены).
int8x8_t vtbl1_s8 (int8x8_t a, int8x8_t b)
int8x8_t vtbl2_s8 (int8x8x2_t a, int8x8_t b)
int8x8_t vtbl3_s8 (int8x8x3_t a, int8x8_t b)
int8x8_t vtblx8_s4 (int8 a
К удивлению мой исходный код
uint8x16_t oddeven(uint8x16_t a) {
auto l = vget_low_u8(a);
auto h = vget_high_u8(a);
auto lh = vuzp_u8(l,h);
return vcombine_u8(lh.val[0], lh.val[1]);
}
создал этот практически единственный код инструкции для нечетного/четного чередования 16-байтового вектора:
adrp x8, .LCPI0_0
ldr q1, [x8, :lo12:.LCPI0_0]
tbl v0.16b, { v0.16b }, v1.16b
ret
Итак, вот он, вариант tbl v0.16.b, { }
, по-видимому, выполняющий полную 16->16 перестановку исходных данных в одной инструкции. Является ли это (не)документированным или может быть создано с помощью встроенных функций?
uint8x16_t vqtbl1q_u8 (uint8x16_t t, uint8x16_t idx)
это то, что вам нужно. - person Ross Ridge   schedule 14.11.2019