CPU実験室

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

浮動小数点テスト

現状のボードで確認できることとして内蔵のFPUの動作を見ておきます。やることはNS320C32ボードでやった例題と全く同じ、実数同士の足し算です。まずマニュアルを読んでトランスピュータでの浮動小数点数値の扱いで判ったことですが

・機能は単精度倍精度の四則演算と平方根、型変換くらいで超越関数、定数発生は無し

・整数演算のAreg、Breg、Cregに対応する浮動小数点演算のためのFAreg、FBreg、FCregがある

・これらには単精度32bit、倍精度64bitのどちらでも入る

・同様にスタック構造になっていて基本スタックトップのAregが演算対象。(これはintel8087と同じ)

オペランドに即値は置けない。すべてメモリ参照

といったところでこんなソースになりました

πeを足したあと1億倍して32bitlong型整数に丸め見える化します。

あとこれはアセンブラの仕様なんですが実数定数を置くのにMASMのようにDD,DQ,DTといった疑似命令が使えません。FLOAT,DOUBLE,REAL32,REAL64といった他の処理系で使われるキーワードも受付けないのでソース内での浮動小数点表記はサポートしてないようです。

仕方がないのでIEEE754/1985浮動小数点値表現に基づくツールやサイトで実数を64bit倍精度形式に変換

 π=3.141592653589793・・・=0x400921fb54442d19

これを32bitづつ低位、高位順の整数型でDD疑似命令を使いソースに埋め込んでいます。ここの部分はソースのデータ行をatof関数でテキスト変換するプリプロセッサを作ってもいいかもしれません

モニタでテストプログラムを転送、実行しました

結果は0x22ED7578となりました。これは10進で585,987,448

内部演算は倍精度ですが最終的な出力は単精度相当に丸められたのでπ+e=5.8598744820488384738229308546322・・のうち小数点以下8桁まで合致となります。