This is caused by the Wii VC incorrectly converting the MIPS cvt.s.d instruction to the PowerPC stfs instruction. With the latter, double to single precision floating point conversion is undefined. The Wii uses round-to-zero for this conversion, while SM64 uses round-to-nearest. 【適当な訳】 このバグは、WiiVCが内部的にMIPS(64のCPU)の命令「cvt.s.d」をPowerPC(WiiのCPU)の命令「stfs」に変換することによって発生します。stfsは倍精度から単精度
設計がおかしいのか? (スコア:1)
浮動小数点演算の規格IEEE754では複数の丸めモードが定義されているが、同じ丸めモードだったら処理結果は完全に一致するのではないのか?
それともIEEE754とは無関係に独自実装したのか?
Re: (スコア:5, 参考になる)
リンク先でたどれるGoogleドキュメントの [google.com]「Wii VC Rounding / BitFS Platform Drift」という項目によると、
Re: (スコア:0)
PowerPCのstfsを使わずに最近接丸めをソフト処理すりゃ直る程度の話かな。
Re: (スコア:0)
CPUの命令はよくわかりませんが、
stfsの前にfrspとかいう命令つかって丸める必要があったのかと
Re:設計がおかしいのか? (スコア:0)
stfsは単純なビットのコピーになってるのか…
ストアと一緒にしときゃいいのにと思ったが、他の命令 [super-computing.org]を見ると浮動小数レジスタの使い方の問題なのか。
倍精度のレジスタを持っているけど単精度演算のときも同じレジスタを使ってて使う命令で精度を区別してるぅ……
倍精度演算の結果をストアせずに単精度演算に持ち込んだりする時に丸め命令単体で普通に使うし、
単精度計算時の倍精度とのコスト差分やストア時の余計な丸めコストを削るとかそういうことか。
FPUレジスタ(というか浮動小数レジスタ)に突っ込んだ時点で拡張倍精度に変換してストアまでそのままが基本なx86FPUの感覚で考えちゃ駄目だなコレ。