STM8S Discoveryその2
今週は、海外から外人が来ていて、彼らをつれてお客さん廻りで東へ西へと忙しいです。信じられないこととかも起きて「こいつらいつか殺してやる」と思ったりして、いい感じに珍道中になっています。それはともかく、STM8S Discoveryの続きです。 プログラミングマニュアル(インストラクションセット)PM0044はここhttp://www.st.com/stonline/products/literature/pm/13590.pdfにドキュメントがあります。ざっと眺めてみると、結構速い。アドレッシングモードは豊富。72h,90h,91h,92hで始まる命令は(多くの場合)アドレッシングモードの変更のプレフィックスになっている。Z-80みたい。コードのコンパクションにはあまり向かない感じです。ほとんどの命令は1クロックで実行できるけど間接アドレッシングを使うと4クロック程度まで落ちる。データバスが8ビットだから、仕方ないか。ハーバードアーキテクチャで、インストラクションバスの幅は32ビット、命令長は最大5バイトなので、命令のコンパクションをするより、インストラクションバスのバンド幅を大きくし、相対的に大き目のコードメモリを積めばよい、という考え方のようです。最大命令長が5バイトなので、8バイト分(2回分)を先読みすると考えると、分岐命令の際は2クロック分余計かかるのが、ストールサイクルになっているのでしょう。1クロック余計でもいいような気がするけど、なんでだろう。乗除算命令がある。除算は可変サイクルで最大サイクル数が17と長いけど、実行中に割り込みを受け付けることができるので、大体アルゴリズムの想像はつくな・・・。メモリーtoメモリーのMOV命令が1サイクルで実行できるということは、データメモリはR/Wで別にアドレッシングできるということかな(ゴージャス) あー、違うみたい。3ステージのパイプラインかな。1ステージ目は命令のデコードとインデックスまでのアドレス計算、2ステージ目で、データメモリのフェッチ、3ステージ目でデータメモリの書き込みをやるんじゃないかな…分岐命令がいわゆるディレイドブランチになってないから、分岐の実施も3ステージ目になっているんじゃなかろうか?だとすると、分岐命令が3クロックなのも納得がいくような気がする。1サイクルで実行できても不思議ない、インデックスレジスタをいじる命令も、2サイクルになっているのは、(次の命令の)2ステージ目に結果を反映させるため、1サイクル分はストールと考えるとだいたい納得がいく。なかなか、面白い。ISSでも作ってみようかな…