ちまちまと自作RISC-Vコアを実装している。DhrystoneがPASSできるようになったが、まだまだ性能的にはひどいもんだ。
次に検討するのはRAS (Return Address Stack)の実装だ。 RASはJALRやJAL命令などのCALL系命令でスタックに戻り値を置き、RET命令がフェッチされた時点でスタックからその値を取り返す。 RET命令が戻るべきアドレスがスタックにすでに置かれているため、パイプラインフラッシュせずに関数の呼び出し元に戻ることができる。
ただし投機実行しているときはそう簡単には上手く行かなくて、投機的に関数呼び出し命令が実行されてその後廃棄された場合、スタックだけは先に進んでしまうがRET命令が呼び出すべきアドレスはずれてしまう。 これを防ぐために、BOOMがどのような技法でRASのずれを回避しているのかを調査すると、各命令がRASのインデックスを持っているらしい。
CALL命令がフェッチされると、そのCALL命令に対応するRASのインデックスが命令に渡される(そしてRASのインデックスはインクリメントされる)。 もしそのCALL命令が廃棄されると、廃棄時にRASのインデックスをその場所まで戻す。そうすることで投機的に実行したRASインデックスを元に戻すことができる。
この機構を実装してみよう。