CPU実験室

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

FPU動作確認

80387で超越関数の演算確認を行いました。
0~360度のsin(x)を求めて総和をとり、正常に計算されれば∫sin(x)dx[0~2π]で0になるはずです。

またシステム変数_8087を強制的にセットしてソフトエミュレーションとの速度比較をしています。

char str[64];
extern int _8087;

void test(void)
{
  double x,s;
  unsigned int t;
  int i;

  tmr_start(3);	/* タイマスタート 625kHz	*/
  s=0;
  for(i=0;i<360;i+=10){ /* sin(x)を0~360°で積分	*/
    x=i*PI/180;
    s+=sin(x);
  }
	
  t=tmr_check();	/* タイマ停止      */
  sprintf(str,"sum=%f time=%luus\n\r",s,(65536-t)*16/10);
  putstr(str);	/* 経過時間表示 */
}

void main(void)
{
  putstr("80387 ON   :");	
/*_8087=1;	*/	/* 80387 イネーブル(もともと)*/
  test();

  putstr("80387 OFF  :");	
  _8087=0;		/* 80387 強制ディセーブル      */
  test();
	
  while(1){
  }
}

結果は
ソフトエミュレーション85ms
8087コード    19msで約4.5倍の速度向上が見られますが、思ったよりかなり遅く感じます。
ウェイト処理が適切でないとか?ハードも少し確認いりそうです。

イメージ 1