SVE2のBGRP命令

news.mynavi.jp

この記事で、Scalable Vector Extension 2(SVE2)について語られています。出典は以下のページの右上の"download presentation"ボタンから得られます。

connect.linaro.org

このプレゼンの26ページ目(=一番上の記事のphoto 02)によると、SVE2にはBDEP, BEXT, BGRPという3つのbit shuffle命令が追加されるそうです。(genomics向け?)BDEPとBEXTはBMI2のpdep,pextと等価なんですが、BGRPは一歩進んでいます。

BGRPの仕様は以下のページに書かれています。

https://developer.arm.com/documentation/ddi0602/2021-09/SVE-Instructions/BGRP--Group-bits-to-right-or-left-as-selected-by-bitmask-?lang=en

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関数に非常に近いです。(完全に同じではありません)

eukaryote.hateblo.jp

(2^n) bit整数のビットを任意の順序にシャッフルする処理は、sag関数(≒BGRP命令)たかだかn回でできます。ちょうどn回でやる方法がハッカーのたのしみ7章に書かれていて、実は場合によってはn回未満でできるということが上のブログ記事で説明されています。