いよいよ自作CPUにベクトル・メモリ・アクセス命令を実装するときが来た。まずは簡単なUnit Strideロード命令を実装しようと思う。 何も考えずに、Cacheableな領域にストレートにアクセスする形式から考えていきたい。
ベクトル・ストア命令の実装を検討している。ベクトル・ストアの超基本的な実装であるが、まずはアドレス変換を行って、その結果をSTQに格納しておく。 このとき、より汎用的なことを考えると、ベクトル・ストアは大量のアドレスを生成するので、その場でSTQを確保する(Late-binding)のようにしておく。 そして、STQがコミット状態になると、まずはストア用のベクトルデータをベクトル・レジスタから回収し、それをストアバッファに転送する。
この辺はいろいろと実装のオプションがあるように思う。
まずは基本的なベクトルストアからベクトルロード命令の挙動が動作するようになってきた。
MW8(0x0000000080003428)=>0000000000000004 MW8(0x0000000080003430)=>0000000000000004 MW8(0x0000000080003438)=>0000000000000004 ========================================== 4703 : 237 : PC=[0000000080002022] (M,45,04) 000097ba c.add a5, a4 GPR[15](106) <= 0000000000000008 4703 : 238 : PC=[0000000080002024] (M,45,08) 00371893 slli a7, a4, 3 GPR[17](137) <= 0000000000000020 4703 : 239 : PC=[0000000080002028] (M,45,16) 00009846 c.add a6, a7 GPR[16](177) <= 0000000080003440 18818 : L1D Load-In : 80003400(00208) : 002f001e_001d001c_002b001a_00190018_00270016_00150014_00230012_00110010_00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000 18818 : Load ISS Check : 80003400 : 00000000_00000004_00000000_00000004_00000000_00000004_00000000_00000004_00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000 Warning : L1D Load Data Compare Error 4704 : 240 : PC=[000000008000202a] (M,46,01) fef654e3 bge a2, a5, pc - 24 4706 : 241 : PC=[0000000080002012] (M,47,01) 40f5873b subw a4, a1, a5 GPR[14](131) <= 000000000000005c 4710 : 242 : PC=[0000000080002016] (M,48,01) 05877757 vsetvli a4, a4, e64, m1, ta, mu GPR[14](1) <= 0000000000000004 18850 : L1D Load-In : 80003400(00208) : 00000000_00000004_00000000_00000004_00000000_00000004_00000000_00000004_00000000_00000004_00000000_00000004_00000000_00000004_00000000_00000004 18850 : Load ISS Check : 80003400 : 00000000_00000004_00000000_00000004_00000000_00000004_00000000_00000004_00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000 18854 : L1D Stq Store : 80003400(00208) : 00000000_00000004_00000000_00000004_00000000_00000004_00000000_00000004________________________________________________________________________ 18854 : STQ ISS Check : 80003400 : 00000000_00000004_00000000_00000004_00000000_00000004_00000000_00000004_00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000 4717 : 243 : PC=[000000008000201a] (M,49,01) 5e07cf57 vmv.v.x v30, a5 VPR[30](35) <= 00000000_00000008_00000000_00000008_00000000_00000008_00000000_00000008_ 4717 : 244 : PC=[000000008000201e] (M,49,02) 02087f27 vse64.v v30, (a6) MW8(0x0000000080003440)=>0000000000000008 MW8(0x0000000080003448)=>0000000000000008 MW8(0x0000000080003450)=>0000000000000008 MW8(0x0000000080003458)=>0000000000000008 ========================================== 4717 : 245 : PC=[0000000080002022] (M,49,04) 000097ba c.add a5, a4 GPR[15](107) <= 000000000000000c 4717 : 246 : PC=[0000000080002024] (M,49,08) 00371893 slli a7, a4, 3 GPR[17](138) <= 0000000000000020 4717 : 247 : PC=[0000000080002028] (M,49,16) 00009846 c.add a6, a7 GPR[16](178) <= 0000000080003460
ここまでのフレームワークが完成すると、LMULを可変にするアプローチができるようになってくる。とりあえずベクトルロードはここまでにして、次に進んでみよう。