ComProc CPUのアドレス空間拡大
即値付き分岐命令の即値幅がsimm12なので
だから、正確には±2KiBということになる
データメモリは64KiBのアドレス空間があるが、効率的に扱えるのは1KiB
即値付きロード・ストア命令の即値幅がsimm10なので
Tang Nano 9K(GW1NR-9)のBRAM
容量は468Kビット
9×2048ビットのBRAMが26ユニット
ComProc CPUが有効に使えるのは416Kビット=52KiB
8×2048×26ビット
現状で64KiBのアドレス空間を使うには
即値付きジャンプ命令は相対ジャンプのため、2KiBずつジャンプすれば64KiBを利用可能
即値無しジャンプ命令(RET)を使えば64KiBアドレス範囲で任意にジャンプ可能
即値付きロード・ストア命令は、CSTACK[0]を基準としたアドレッシングモードを使えば64KiBを利用可能
絶対アドレス(ZERO+offset)では先頭512Bのみ利用可能
即値をuimm10に修正すれば、先頭1KiBに拡大される
即値無しロード・ストア命令は64KiBを利用可能
即値付きロード・ストア命令
コンパイラは現状、cstack+offsetかzero+offsetのアドレッシングモードのみ利用する
前者はローカル変数、後者はグローバル変数
即値付きロード・ストア命令の即値はsimm10ではなくuimm10にすべきかも。
ローカル変数はCSTACK[0]を先頭として、その後ろに生成される
CSTACK[0]より若いアドレスにアクセスしたくなることが、現状では無いので。
位置独立実行コード生成に対応しようとすると、ip+simm10ができるのはメリットではある
位置独立実行コード生成にとって、simm10は範囲が狭すぎるて使い物にならないという話はある
グローバル変数は、現状では0x100~0x2FFに配置される
あれ?もしかして、simm10のままだと0x200~0x2FFがアクセス不能か?
uimm10なら0x3FFまでは拡大できる
グローバル変数領域を拡大すると、即値無しロード・ストア命令を使う必要が出てくる
ベースアドレスレジスタの構想
アドレッシングモードX+offsetのX
現状:zero, fp, ip, cstack
変更案:zero, bar, ip, cstack
ベースアドレスレジスタ(BAR)はメモリアドレスを16ビットで保持
アドレッシング時にベースアドレスとして利用できる
X=fpを無くす理由
現状のコンパイラで使っていない
「現在のFPの値を読みたい」というケースも、命令の組み合わせでカバー可能
cpush fp, push cstack+0, cpop fpで、FPの値をstack[0]に積める
X=zeroを残す理由
メモリマップトI/Oが0x0000~0x00FFに配置されているので、メモリ先頭の読み書きは効率的にしておきたい
X=zeroが無くなると、いちいちBARを0にリセットしないとメモリマップトI/Oを使えない
X=ipを残す理由
現状のコンパイラで使っていないのはX=fpと同じ。
FPの値を取得する代替手段があるが、IPは代替手段が無いから。
いや、嘘。あるっちゃある。
call HOGE, push cstack+0, retで、IPの値をstack[0]に積める
HOGE関数を作る必要があり、FPの取得より面倒
BARと即値なしロードストア命令
即値ありロードストア命令にはXを指定できる
即値なしロードストア命令には、現状、Xを指定ができない
即値なしロードストア命令でもBARを基準とするアドレッシングを行いたい
即値なしストア命令
stack0はアドレス、stack1はデータ
即値なしストア命令では、ALUは単にsrc_aを出力
ALUをA+Bモードにしてsrc_bにBAR を入れれば、stack0+BARが計算可能!