レジスタ中のビット列の順序を入れ替える命令についてまとめます。
rsレジスタの中身が[tex: \Sum{i=0}^{XLEN-1}2i\dot a_i]だった時、rdレジスタに[tex: \Sum{i=0}^{XLEN-1}2i\dot a_{f(i)}]を書き込みます。
ここで、は、[0, X_LEN-1]から[0, X_LEN-1]への全単射です。XLENは、レジスタの幅で、32とか64です。
rol, ror, rori
循環シフト(ローテート)です。入れ替えの計算式は、循環シフト幅をとして
(左ローテートの場合)、
です。
循環シフト幅が定数の命令は、roriのみです。これは、左ローテートでできることと右ローテートでできることは同一だからです。
実際、左kビットローテートは、右(XLEN-k)ビットローテートと同値です。
grev, grevi
ビット列順序逆転の一般化です。入れ替えの計算式は、パラメータ値をとして
です。
の時、ビット列順序逆転になります。
それ以外のパラメータのうち、二進法で表した時010*のようにあらわせるパラメータ値では、より幅の短いXLEN'(1, 2, 4, 8, 16, 32)に対するXLEN''(1,2,4,8,16,32)ビット毎のブロックの列順序逆転のSIMD命令とみなせます。
さらにそれ以外のパラメータ値の場合は、解釈の難しい動作をすることになります。
shfl, unshfl, shfli
ビット列のアウトシャッフルの一般化です。入れ替えの計算式を書き下すことは難しいですが、になっています。パラメータ値がXLEN-1の時、アウトシャッフルになります。