chibicc compiler を6800向けに改造する (6) IEEE754 float (1)

BASICMASTER, 昔のパソコン

chibicc 6800 には、IEEE754形式の32bit floatを実装している。オールアセンブラなので、割と速い。

chibicc用のfloatの基本部は2週間ほどで書けて、マンデルブロ集合のASCII Artが、実数計算で動くようになった。

整数計算バージョンに比べて3倍遅いけど、floatを振り回して3倍差なら速い方じゃなかろうか。


Fuzix C Compiler Kit の float library

Fuzix C Compiler Kit にも float があり、Pat Wood氏がCで書いたライブラリが使われている。

Cで書かれていて遅かったので、アセンブラで書き直してissueを送ったのだけど、採用されなかった。メンテナンスコストが上がるから、仕方ない。

chibicc 6800バージョン

chibicc 6800は、Fuzix C compiler と、long/float や引数の扱いが異なるので、fcc用に作ったバージョンは捨てて書き直すことにした。

Cで参考になるライブラリを探したのだが、32bit整数が扱える前提でバリバリ書かれていて、参考にするのは難しかった。

しかたないので規格をもとに書くことにした。

割り切って書けば、それほど難しくない

IEEE754には細かい仕様が山のようにあるが、ある程度の計算ができれば良いと割り切れば、加減乗除を書くのはそれほど難しくない。

まずは、こんなスペックで書いてみた。

  • オーバーフローは考えない
  • Inf, NaN, -0.0 も考えない
  • 非正規化数(Subnormal Number)も考えない

この仕様でも考えないといけないことは山ほどある。最上位bitからの桁上げの対処、アンダーフローの検出。0.0での除算の検出などである。

加減算だと桁合わせのためのシフトが発生する。乗除算を何bitで行うかの判断も難しい(今は素直に24bit*24bit=48bitにしているが、結果32bitぐらいで良いはず)。

加減乗除以外に比較演算も必要だし、比較の結果でどう分岐するかも考えないといけない。
(NaNが絡むと分岐の仕方も変わることにあとで気がついて、これも大変だった)

続く。

参考資料

「浮動小数点数内部表現シミュレーター」は実に便利である。IEEE754の内部表現と、2進・10進・16進表現を相互変換できる。