この記事で、Scalable Vector Extension 2(SVE2)について語られています。出典は以下のページの右上の"download presentation"ボタンから得られます。
このプレゼンの26ページ目(=一番上の記事のphoto 02)によると、SVE2にはBDEP, BEXT, BGRPという3つのbit shuffle命令が追加されるそうです。(genomics向け?)BDEPとBEXTはBMI2のpdep,pextと等価なんですが、BGRPは一歩進んでいます。
BGRPの仕様は以下のページに書かれています。
C++でBMI2で書くとこんな感じになります。第一引数xのビットのうち、第二引数maskで1が立っている場所のビットを下位側に寄せて、残りのビットを上位側に寄せるというものです。
uint64_t BGRP(uint64_t x, uint64_t mask) { return pext(x, mask) | (pext(x, ~mask) << (_mm_popcnt_u64(mask))); }
このブログの以前の記事でハッカーのたのしみ7章について扱ったやつがあるのですが、そこで出てきたsag関数に非常に近いです。(完全に同じではありません)
(2^n) bit整数のビットを任意の順序にシャッフルする処理は、sag関数(≒BGRP命令)たかだかn回でできます。ちょうどn回でやる方法がハッカーのたのしみ7章に書かれていて、実は場合によってはn回未満でできるということが上のブログ記事で説明されています。