CPU実験室

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

浮動小数点演算

デジタル系のハードデバッグもできたし、Cでの開発環境も整ったので部品がそろうまで他のプロジェクトに移行しようかと思ったのですが、一応確認で浮動小数点演算が動くかやってみました。ADSP2101アーキテクチャ自体が固定小数点での処理を想定していてソフト的に浮動小数点実数を扱うのはオーバーヘッドが大きくなるだろうし向いていないのですが、コンパイラdoublefloat型をサポートしているのでコーディングはできます。

例題はいつものようにマンデルブロ集合の全体像描画で実軸-2~1、虚軸-1.5~1.5をキャラクタ画面の80桁×40行メッシュで計算させます。

f:id:O3I:20210724103018j:plain

複素座標上の点z=a+biマンデルブロ集合に属するかのチェック関数mandel_chk()は他の処理系で使ったものそのままです

f:id:O3I:20210724103031j:plain

 

実行させた状態です。全描画に約35秒かかっています。

f:id:O3I:20210724103043j:plain

 

まあ何とか動きましたが、コンパイル後のアセンブラコードをみるとかなりめんどくさいことになっています。処理の本体:mandel_chk()の関数入口処理直後から出口処理直前までのコードの実体をベタで貼り付けますがステップ数はエラい長さになっています。データメモリに仕舞ったり出したり何をやっているのかわけが分からずコードから全く追えないのと、浮動小数点の四則演算はしっかりライブラリを呼び出しているので全体のCPU時間はかなりかかってそうです。

 

! END FUNCTION PROLOGUE: mandel_chk
i6=1;
modify(i6,m4);
i5=-34;
i7=-34;
modify(i5,m4);
modify(i7,m4);
m5=31;
m7=1;
dm(i5,m5)=1;
ay1=dm(i7,m6);
m5=ay1;
ar=dm(i6,m5);
m5=-3;
dm(i5,m7)=ar;
m0=4;
i2=i6;
ay1=dm(i2,m2);
i2=m4;
dm(i5,m5)=ay1;
m5=1;
modify(i2,m0);
i6=3;
modify(i6,m4);
mx1=0;
ay1=dm(i6,m6);
dm(i5,m5)=ay1;
ay1=dm(i2,m2);
i2=-1;
my0=0;
m5=-3;
ay0=1;
dm(i5,m5)=ay1;
dm(i5,m7)=0;
dm(i5,m6)=0;
mandel_chkL15_:
ar=not ay0;
m7=4;
ax1=ar;
call led_dset_;
m5=i2;
dm(i4,m5)=my0;
dm(i4,m5)=mx1;
dm(i4,m5)=my0;
dm(i4,m5)=mx1;
call __mulsf3_;
modify(i4,m7);
m7=6;
i5=-13;
m5=1;
modify(i5,m4);
dm(i5,m5)=sr1;
m5=i2;
dm(i5,m7)=sr0;
m7=-1;
ay1=dm(i5,m7);
m7=1;
dm(i4,m5)=ay1;
ay1=dm(i5,m7);
m7=-1;
dm(i4,m5)=ay1;
ay1=dm(i5,m7);
dm(i4,m5)=ay1;
ay1=dm(i5,m6);
i5=-15;
dm(i4,m5)=ay1;
call __mulsf3_;
m5=4;
modify(i4,m5);
m5=1;
modify(i5,m4);
dm(i5,m5)=sr1;
m5=i2;
dm(i5,m6)=sr0;
ay1=dm(i5,m7);
m7=3;
dm(i4,m5)=ay1;
ay1=dm(i5,m7);
m7=-1;
dm(i4,m5)=ay1;
ay1=dm(i5,m7);
dm(i4,m5)=ay1;
ay1=dm(i5,m6);
dm(i4,m5)=ay1;
call __subsf3_;
m5=4;
modify(i4,m5);
m5=1;
i5=-17;
m7=14;
modify(i5,m4);
dm(i5,m5)=sr1;
m5=i2;
dm(i5,m7)=sr0;
m7=-1;
ay1=dm(i5,m7);
m7=-13;
dm(i4,m5)=ay1;
ay1=dm(i5,m7);
m7=-1;
dm(i4,m5)=ay1;
ay1=dm(i5,m7);
dm(i4,m5)=ay1;
ay1=dm(i5,m6);
i5=-19;
dm(i4,m5)=ay1;
call __addsf3_;
m5=4;
modify(i4,m5);
m5=1;
modify(i5,m4);
dm(i5,m5)=sr1;
i7=-19;
m7=9;
modify(i7,m4);
dm(i5,m7)=sr0;
ay1=dm(i7,m6);
i7=-18;
modify(i7,m4);
dm(i5,m5)=ay1;
m5=-13;
ay1=dm(i7,m6);
dm(i5,m5)=ay1;
m5=1;
dm(i5,m5)=mx1;
m5=i2;
m7=-1;
dm(i5,m6)=my0;
ay1=dm(i5,m7);
m7=1;
dm(i4,m5)=ay1;
ay1=dm(i5,m7);
m7=-1;
dm(i4,m5)=ay1;
ay1=dm(i5,m7);
dm(i4,m5)=ay1;
ay1=dm(i5,m6);
dm(i4,m5)=ay1;
call __addsf3_;
m5=4;
modify(i4,m5);
m5=1;
i5=-23;
m7=16;
modify(i5,m4);
dm(i5,m5)=sr1;
m5=i2;
dm(i5,m7)=sr0;
m7=-1;
ay1=dm(i5,m7);
m7=-15;
dm(i4,m5)=ay1;
ay1=dm(i5,m7);
m7=-1;
dm(i4,m5)=ay1;
ay1=dm(i5,m7);
dm(i4,m5)=ay1;
ay1=dm(i5,m6);
dm(i4,m5)=ay1;
call __mulsf3_;
m5=4;
modify(i4,m5);
m5=1;
i5=-25;
m7=20;
modify(i5,m4);
dm(i5,m5)=sr1;
m5=i2;
dm(i5,m7)=sr0;
m7=-1;
ay1=dm(i5,m7);
m7=-19;
dm(i4,m5)=ay1;
ay1=dm(i5,m7);
m7=-1;
dm(i4,m5)=ay1;
ay1=dm(i5,m7);
dm(i4,m5)=ay1;
ay1=dm(i5,m6);
i5=-27;
dm(i4,m5)=ay1;
call __addsf3_;
m5=4;
modify(i4,m5);
m5=1;
modify(i5,m4);
dm(i5,m5)=sr1;
i7=-27;
m7=15;
modify(i7,m4);
dm(i5,m7)=sr0;
ay1=dm(i7,m6);
i7=-26;
dm(i5,m5)=ay1;
m5=2;
modify(i7,m4);
m7=-1;
ay1=dm(i7,m6);
dm(i5,m5)=ay1;
ay1=dm(i5,m7);
m5=i2;
m7=1;
dm(i4,m5)=ay1;
ay1=dm(i5,m7);
m7=-1;
dm(i4,m5)=ay1;
ay1=dm(i5,m7);
dm(i4,m5)=ay1;
ay1=dm(i5,m6);
dm(i4,m5)=ay1;
call __mulsf3_;
m5=4;
modify(i4,m5);
m5=1;
i5=-29;
m7=18;
modify(i5,m4);
dm(i5,m5)=sr1;
m5=i2;
dm(i5,m7)=sr0;
m7=-1;
ay1=dm(i5,m7);
m7=1;
dm(i4,m5)=ay1;
ay1=dm(i5,m7);
m7=-1;
dm(i4,m5)=ay1;
ay1=dm(i5,m7);
dm(i4,m5)=ay1;
ay1=dm(i5,m6);
i5=-31;
dm(i4,m5)=ay1;
call __mulsf3_;
m5=4;
modify(i4,m5);
m5=1;
modify(i5,m4);
dm(i5,m5)=sr1;
m5=i2;
dm(i5,m6)=sr0;
ay1=dm(i5,m7);
m7=3;
dm(i4,m5)=ay1;
ay1=dm(i5,m7);
m7=-1;
dm(i4,m5)=ay1;
ay1=dm(i5,m7);
dm(i4,m5)=ay1;
ay1=dm(i5,m6);
i5=-33;
dm(i4,m5)=ay1;
call __addsf3_;
m5=4;
modify(i4,m5);
m5=1;
modify(i5,m4);
dm(i5,m5)=sr1;
m5=i2;
dm(i5,m6)=sr0;
dm(i4,m5)=0;
dm(i4,m5)=16512;
ay1=dm(i5,m7);
dm(i4,m5)=ay1;
ay1=dm(i5,m6);
dm(i4,m5)=ay1;
call __gtsf2_;
m5=4;
modify(i4,m5);
af=pass ar;
if le jump mandel_chkL14_;
ar=ay0;
jump mandel_chkL16_;
mandel_chkL14_:
m5=1;
i7=-11;
i5=-9;
modify(i7,m4);
modify(i5,m4);
ay1=dm(i7,m6);
i7=-10;
modify(i7,m4);
ar=ay0+1,mx1=dm(i5,m5); !!PRLL-2
ay0=ar;
m7=1;
ax1=29;
my0=dm(i5,m7);
dm(i5,m5)=ay1;
ay1=dm(i7,m6);
af=ay0-ax1,dm(i5,m6)=ay1; !!PRLL-2
if le jump mandel_chkL15_;
ar=0;
mandel_chkL16_:
! FUNCTION EPILOGUE: mandel_chk