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形式の命令を張っておきます。