俺と FIST と微妙な非互換性

いや、なんといいますか、このへんでごにょごにょやってたアレなんですが、もうすこし調べてみました。
んで適当にサンプル作ってみました(Watcom だと DOS/OS2/Win32 バイナリを3つ一気に作れるのでこういうときは便利だ)。

fptest_20050830.zip

手元の環境で調べてみた時の結果を log/ にぶちこんであります。

まあ要点は「無効操作例外をマスクしてないとき、32bit 整数に収まらない数を FIST(P) 命令でメモリにストアするとどうなるか」ということになるわけなんですが、手元の環境で試した限りでは、AMD DuronCeleron の挙動が明らかに異なるのでちょっと困った。Am486 と Celeron で動作が同じなのでたぶん Duron がちょっとヘンなんだと思うけど…(qemu とか bochs の場合は「エミュレーションが不完全」という一言で片付けられそうな気もするが、実機だし)。

このへんの違いは何か資料があるんだろうか。(あと OS/2 の場合、V4.0 レベルのカーネルと V4.5 レベルのカーネルで FPU 例外ハンドラの挙動に違いがある可能性も否定できず…)