背景
OpenSUSIは東海理化のTR-1umのPDKをNDA不要で使えるらしいのです。1umすなわち1000nmですから最先端半導体とは世界が違いますがスタンダートセル レベルなら、ラピダスのPDKにコンバートできることを考えていれば、いいのかなぁと。実際に役立つ見通しが必要ですが。 昔の人はテクノロジマッピングといっていたようですが、最近は、どういうテクニカルタームなのだろう、、、考えているうちにトランジスタ当たりの性能を最重要にしたCPU WZetaなら1000nmでもビジネスを若い人たちでも考えられるかもと。 そしてWZetaの複合命令の話をしてみることに。3年前に公開していた16bit CPU WZetaの命令セットアーキテクチャ仕様にあったもの。
WZetaとは
WZetaは小型で高性能な16bit CPUです。従来の半分の回路規模で倍の性能というイメージ。小型の2コアが作りやすいアーキテクチャでマイコンで便利。最悪ケースの応答時間が正確に見積もりやすいため限界まで周波数を落とせる。究極の省資源CPU。
なぜWZetaは複合命令なのか?
あまり従来の8bit CPUや16bit CPUで見かけない命令です。昔はコンパイラが複合命令を使いこなすことが難しかったという理由はあると思います。
トランジスタ数当たりの性能を上げるためにスーパースカラより複合命令で性能を稼ぐほうが都合がいい。
レジスタ間転送は1バイトの命令であるCPUもありますがWZetaは2バイト(16bit)固定長なので複合命令にして性能を稼ぎたいかもしれない。
回路設計で、ちょっと工夫をすると、非常にトランジスタ数当たりの効率が高い複合命令が作れる。 命令セットのビットの割り当ても慎重に考える必要はあります。ただし大局を見失わないことが、できる人でないと厳しい。細かい最適化に注意を払ったためにCPU全体としてのバランスを壊して実用性を失いかねない。
LD命令の複合命令
実際の回路を考えると、これが効率的な理由がわかると思います。

最後に
まだ他にもWZetaには複合命令があります。インクリメント/デクリメント命令ですが、命令に特長があります。この複合命令によって8bitデータバスで16bitデータバスと同等の性能が出せるのですが、それが結構、楽しみです。
データバス16bitと同じ性能が8bitバスでも出せる例です。
注) わかりやすくするため16bit操作のプレフィックスは省略。
64bit加算 [A:B] = [A:B] + [X]
LD C,[X] ; 最初の4サイクルで8bitバス2回リード
ADD [A:B],C
DINC X,B ; X=X+2 , B=B+2 (裏でADDの後半処理)
LD C,[X]
ADDC [A:B],C
DINC X,B ; X=X+2 , B=B+2
LD C,[X]
ADDC [A:B],C
DINC X,B ; X=X+2 , B=B+2
LD C,[X]
ADDC [A:B],C
上記の命令列をハードマクロ命令に設定する。ハードマクロ命令はアドレス上位にあるメモリへ高速ジャンプとゼロサイクルリータンと考えてください。
WZetaにはスタック命令がありませんが、このハードマクロ命令の63番を活用すると、スタック命令を持ったCPUよりサブルーチンが高速です。
WZetaの命令セットは8bitバスで16bitバスと同等の性能を出すための回路設計に技術的センスが必要で、回路実装と命令セットを1人で同時進行させながら作っていました。この設計が命令セットに特長として表れていると思います。これが世に出されないことは人類の損失だと本気で思っています。僕が壊れないように、お願いします。