toge's diary

コンピュータ関連の趣味をつらつらと。

SSEまで含めたFPU例外処理

昨日の続き。

id:shinichiro_hさんのアドバイスにしたがって、herumiさんの記事 http://homepage1.nifty.com/herumi/prog/binary.html##99 を参考にしました。

自分のところでは動作確認できました。所詮ゲーム用途なので今のところこれで十分。
あとはSSE1命令が使えるかどうかの判定が必要か・・・。

#ifdef __i386__
    {
      short cw;
      __asm__ volatile("fnstcw %0":"=m"(cw));
      cw &= ~(0x1 | 0x4); // 不正操作、ゼロ除算のみ検出
      __asm__ volatile("fldcw %0"::"m"(cw));
      
      int mxcsr;
      __asm__ volatile("stmxcsr %0":"=m"(mxcsr));
      mxcsr &= ~((1 << 7) | (1 << 9));  // 不正操作、ゼロ除算のみ検出
      __asm__ volatile("ldmxcsr %0"::"m"(mxcsr));
    }
#endif