前回の続きで,RVCを含んだ命令キャッシュブロックから命令を正しく切り出す方法を検討していく.
ここでは,命令が128ビットであり命令のズレが起きていない(つまり過去のキャッシュブロックの16ビットを引きずっていない)ものとする.
128ビットの命令キャッシュブロックだと,16ビットの命令が最大で8個抽出できるようになるので,これをどのように抽出するのかを考えたい.
8個の命令を,どこから抽出するのかについてそれぞれ考えたい:
- 0番目の命令:最も下位の命令がRVC命令だと,それをそのまま抽出する(rvc[0]).そうでない場合,RVI命令の32ビット(rvi[1:0])を抽出する.
- 1番目の命令:
count1(is_rvc[1:0]) == 0)
の場合,rvi[3:2]
もしくはrvc[2]
を切り出し.count1(is_rvc[0:0]) == 1)
の場合,rvi[2:1]
もしくはrvc[1]
を切り出し.
- 2番目の命令:
count1(is_rvc[3:0]) == 0)
の場合,rvi[5:4]
もしくはrvc[4]
を切り出し.count1(is_rvc[2:0]) == 1)
の場合,rvi[4:3]
もしくはrvc[3]
を切り出し.count1(is_rvc[1:0]) == 2)
の場合,rvi[3:2]
もしくはrvc[2]
を切り出し.
- 3番目の命令:
count1(is_rvc[5:0]) == 0)
の場合,rvi[7:6]
もしくはrvc[6]
を切り出し.count1(is_rvc[4:0]) == 1)
の場合,rvi[6:5]
もしくはrvc[5]
を切り出し.count1(is_rvc[3:0]) == 2)
の場合,rvi[5:4]
もしくはrvc[4]
を切り出し.count1(is_rvc[2:0]) == 3)
の場合,rvi[4:3]
もしくはrvc[3]
を切り出し.
- 4番目の命令:
count1(is_rvc[6:0]) == 1)
の場合,rvc[7]
を切り出し.count1(is_rvc[5:0]) == 2)
の場合,rvi[7:6]
もしくはrvc[6]
を切り出し.count1(is_rvc[4:0]) == 2)
の場合,rvi[6:5]
もしくはrvc[5]
を切り出し.count1(is_rvc[3:0]) == 3)
の場合,rvi[5:4]
もしくはrvc[4]
を切り出し.
- 5番目の命令:
count1(is_rvc[6:0]) == 3)
の場合,rvc[7]
を切り出し.count1(is_rvc[5:0]) == 4)
の場合,rvi[7:6]
もしくはrvc[6]
を切り出し.count1(is_rvc[4:0]) == 5)
の場合,rvi[6:5]
もしくはrvc[5]
を切り出し.
- 6番目の命令:
count1(is_rvc[6:0]) == 5)
の場合,rvc[7]
を切り出し.count1(is_rvc[5:0]) == 6)
の場合,rvi[7:6]
を切り出し.
- 7番目の命令:
count1(is_rvc[6:0]) == 7)
の場合,rvc[7]
を切り出し.
これで,どれくらい論理がシンプルになるかしら.ちょっと作ってみないとわからないところがある.