今回ご紹介するのは、拡張命令の1つのでアトミック命令です。
仕様書には以下のように書いてあります。
The standard atomic-instruction extension, named “A”,
contains instructions that atomically read-modify-write memory
to support synchronization between multiple RISC-V harts running
in the same memory space.

リード・モディファイ・ライトを不可分に行うための命令で、
同一のメモリ空間で複数のコアで実行する時の同期などに使う事なります。

これは、組込みシステムでは重要なポイントです。Arm社のCortex-Mでは
メモリ上のデータに対するリード・モディファイ・ライトをする命令がありません。
当初は、ビットバンドというハードでその仕組みを用意しましたが、
キャッシュメモリを採用したマイコンはビットバンドが使えない状態です。

なぜアトミックな命令が必要か?考えてみましょう。
以下の2つのタスクがマイコン上で動きます。同一変数上にビットを持って管理します。
タスク1は1ビット目、タスク2は2ビット目を使用します。
組込みではメモリ容量とかでこうした使い方は良くあります。

RISCと言われるCPUはメモリの値を直接変更しないことが基本で、RISC-Vもベースはそうです。
そうすると、メモリ上の変数を変更する時にリード→モディファイ→ライトの3ステップが必要です。
するとマルチタスクなソフト(別に、RTOSとか使わなくても、割込みを使ったシステムでも同様)では、
以下のようなことが起きる可能性があります。

タスク1がリード→モディファイをしたところで、タスクスイッチでタスク2が実行を開始したとします。
すると、タスク2のなかでリードー>モディファイ→ライトを実行してします。
タスク2のライトが終わった後に、また、タスクスイッチが発生します。
すると、タスク1が実行していたリード→モディファイ→ライトのライトを実行します。
すると、タスク2の結果を上書きしてしまうので、結果がおかしくなります。
本当は、0x3になっていないといけないのに、0x01となっています。

そのため、リード→モディファイ→ライトをまとめて実施するアトミックな命令が欲しくなります。
AMOという先頭の命令が、Atomic Memory Operationの略でアトミックな命令です。