CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

倍精度化処理

 

NS32Kアセンブラでのマンデルブロ集合計算を倍精度化しました。

やることは命令セットを倍精度用のものに差し替えることと使用する浮動小数レジスタをF0,F2,F4,F6の4本に絞ることです。計算対象の複素座標c=a+biの実部aをF0,虚部bをF2、ループさせる漸化式の実部xをF4,虚部yをF6にレジスタを割り振るとこれでもう使い切ってしまいますので、あとの作業用変数はすべてメモリ上に持たなければならないということです

ということで書き直した倍精度版mandel_chkサブルーチンはこんな感じです。

f:id:O3I:20200523211213j:plain

このようにTOS(Top Of Stack)アドレッシングを多用していて、値をスタックにプッシュ。レジスタとポップしたスタック先頭の値を演算してスタック先頭にプッシュの繰り返しです。レジスタ本数が少ないとコーディングしにくいと思いがちですがスタックマシンとしてコーディングすると多数のレジスタを無計画に使ってしまうよりずっとシンプルに記述できます。命令の並び方も自ずと逆ポーランド記法RPN)になります。

ループに入った直後の6つの命令でスタックがどのように動くかを示すと以下のようになります

f:id:O3I:20200523223422j:plain

ちょっとわかりにくいのが⑤の命令でソースもディストネーションもTOSにしてあります。これはスタックから2個データをポップしてきて演算し、結果をスタックにプッシュなのですがスタックの深い方と浅い方、どちらからどちらを引くのか?というのが迷います。

正解は深い方から浅い方を引く、なのですが最初これを間違えていて先にY*YをプッシュしたためにX←Y*Y-X*X+Aと処理されてしまい集合の全体像がこんなことになってしまいました。

 

f:id:O3I:20200523211638j:plain