RISC-Vのビット操作系拡張(B拡張)のまとめ(その2)

レジスタ中のビット列の順序を入れ替える命令についてまとめます。

rsレジスタの中身が[tex: \Sum{i=0}^{XLEN-1}2i\dot a_i]だった時、rdレジスタに[tex: \Sum{i=0}^{XLEN-1}2i\dot a_{f(i)}]を書き込みます。 ここで、 i → f(i)は、[0, X_LEN-1]から[0, X_LEN-1]への全単射です。XLENは、レジスタの幅で、32とか64です。

rol, ror, rori

循環シフト(ローテート)です。入れ替えの計算式は、循環シフト幅を kとして f(i) = (i+k) \mod XLEN(左ローテートの場合)、 f(i) = (i-k) \mod XLENです。

循環シフト幅が定数の命令は、roriのみです。これは、左ローテートでできることと右ローテートでできることは同一だからです。 実際、左kビットローテートは、右(XLEN-k)ビットローテートと同値です。

grev, grevi

ビット列順序逆転の一般化です。入れ替えの計算式は、パラメータ値を kとして f(i) = i XOR kです。 k = XLEN-1の時、ビット列順序逆転になります。 それ以外のパラメータのうち、二進法で表した時010*のようにあらわせるパラメータ値では、より幅の短いXLEN'(1, 2, 4, 8, 16, 32)に対するXLEN''(1,2,4,8,16,32)ビット毎のブロックの列順序逆転のSIMD命令とみなせます。 さらにそれ以外のパラメータ値の場合は、解釈の難しい動作をすることになります。

shfl, unshfl, shfli

ビット列のアウトシャッフルの一般化です。入れ替えの計算式を書き下すことは難しいですが、 f(i) = iのビット列の順序を変更したものになっています。パラメータ値がXLEN-1の時、アウトシャッフルになります。