Там - это инструкция для этого в AVX512BW, только с другим именем. _mm512_movepi8_mask
/ vpmovb2m k, zmm
, доступно для каждого размера элемента от байта до qword. (AVX512DQ для версий D и Q, AVX512BW для версий B и W).
Также есть маска -> обратная маска перемещения вектора, vpmovm2b
(снова доступна для всех размеров элементов ).
AVX512, конечно, также имеет различные команды cmp
и test
в маске, поэтому с вектором set1_epi8(1<<n)
вы можете захватить любую битовую позицию в регистр маски с помощью vptestmb k2{k1}, zmm2, zmm3/m512
; _mm512_test_epi8_mask
. Обратите внимание, что в отличие от vpmov2bm
, он поддерживает нулевую маскировку в место назначения для эффективного И с другой маской k
бесплатно, поэтому, возможно, стоит использовать, даже если вам просто нужен высокий бит.
Также есть версия NAND vptestnmb
. Версии D и Q этих операндов-источников поддерживают широковещательную память, а версии B и W.
С 8 различными константами маски вы можете извлекать разные биты из развернутого l oop, не тратя никаких затрат. инструкции по смене. Или вы можете извлечь разные биты из разных элементов.
Это все AVX512BW, доступные на процессорах AVX512, начиная со Skylake-AVX512, но не Xeon Phi (KNL / KNM).