Есть ли встроенный Armv8-A для 16-байтового VTBL?

Согласно моему регулярно используемому источнику 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 перестановку исходных данных в одной инструкции. Является ли это (не)документированным или может быть создано с помощью встроенных функций?

Полный код и список на Godbolt.org


person Aki Suihkonen    schedule 14.11.2019    source источник
comment
Похоже, uint8x16_t vqtbl1q_u8 (uint8x16_t t, uint8x16_t idx) это то, что вам нужно.   -  person Ross Ridge    schedule 14.11.2019
comment
Более того, я даже указал его в руководстве по внутренним компонентам, если q находится в нужном месте.   -  person Aki Suihkonen    schedule 14.11.2019


Ответы (2)


Вы можете найти его в руководстве по внутренним компонентам, выполнив поиск по tbl (мнемоника инструкции), затем «поиск на странице» для 16, пока не дойдете до некоторых uint8x16_t версий, чтобы найти схему именования встроенных элементов для них. uint8x16_t vqtbl1q_u8 (uint8x16_t t, uint8x16_t idx)

(Спасибо @RossRidge за то, что в первую очередь указал правильное имя; смысл этого ответа состоит в том, чтобы предложить способ найти встроенные функции на основе известной мнемонической инструкции. Он лучше работает для внутреннего поиска Intel x86, где размер элемента является частью мнемоники, поэтому поиск по ассемблерной мнемонике обычно сужает список внутренних результатов в достаточной степени для визуального просмотра.)

person Peter Cordes    schedule 14.11.2019

Нет, для 16-байтовой перестановки нет встроенных функций, хотя инструкция tbl для aarch64 ее принимает.

person Jake 'Alquimista' LEE    schedule 14.11.2019