RV32Iの基本命令セットでのR形式の命令を見ていきます。
R形式の命令を調べてみると、以下のものが該当するようです。
シフト命令を見ると、3つありますが、論理的なシフトが右シフト(SRL)、左シフト(SLL)の2つ、
算術シフトが右シフト(SRA)の1つです。
算術の左シフトは必要ないのか?という疑問が出る方もいるかもしれませんので、
簡単に説明しておきましょう。
算術シフトは、signedの整数でつかいます。
signedの変数の最上位桁(MSB)は符号を示します。
たとえば、整数8という数字は0x00000008とあらわされて、最上位は0ですね。
じゃあ、整数ー1の場合は0xFFFFFFFFで、最上位桁は1です。
算術右シフトの場合には、最上位の符号桁を維持します。
以下の例では算術右シフトで4ビットシフトしています。
マイナスの数字なので、最上位桁に1が入っていますので、4ビット右シフトしたら以下の図になります。
算術左シフトの場合には、右から来たデータで符号桁を上書きしていくので、特に符号を意識しなくてよいです。
途中でゼロが出てくるとおかしくなるのでは?と思った方は正解です。
1ビット左シフトするとx2になりますので、下の例が最初10進数-117,440,513だったのですが、
4ビットシフトするとx16になりますので、真ん中の-1,879,048,208となります。
ここで、int(32bit)の最大値、最小値を考えると、-2,147,483,648~2,147,483,647になります。
さらに1ビットシフトするともう符号付intで取りえる値を超えてしますので、どうしようもない状態となります。
実際のシフト演算のマシン語は以下のようになります。
Opecodeは同一で、funct3、func7で区別するようになっています。
加算、減算は以下のマシン語です。
特に説明することないので、残りのR形式の命令を張っておきます。