From 410e02ceafebfbc132466c27196d7d67a181fe36 Mon Sep 17 00:00:00 2001 From: ehofman Date: Fri, 14 May 2004 11:58:57 +0000 Subject: [PATCH] Add some floating point (exception) optimizations for IRIX machines. --- src/Main/bootstrap.cxx | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/Main/bootstrap.cxx b/src/Main/bootstrap.cxx index 39bfcbc89..88664bd8d 100644 --- a/src/Main/bootstrap.cxx +++ b/src/Main/bootstrap.cxx @@ -110,6 +110,29 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, } #endif +#if defined( sgi ) +#include + +/* + set the special "flush zero" bit (FS, bit 24) in the Control Status + Register of the FPU of R4k and beyond so that the result of any + underflowing operation will be clamped to zero, and no exception of + any kind will be generated on the CPU. This has no effect on an + R3000. + + the FS bit is inherited by processes fork()ed out of this one, + but it is not inherited across an exec(). so anytime you exec() + a process, you must re-set the FS bit in that process. + */ +void flush_fpe(void) +{ + union fpc_csr f; + f.fc_word = get_fpc_csr(); + f.fc_struct.flush = 1; + set_fpc_csr(f.fc_word); +} +#endif + // Main entry point; catch any exceptions that have made it this far. int main ( int argc, char **argv ) { @@ -118,6 +141,10 @@ int main ( int argc, char **argv ) { initFPE(); #endif +#if defined(sgi) + flush_fpe(); +#endif + // Enable floating-point exceptions for Windows #if defined( _MSC_VER ) && defined( DEBUG ) // Christian, we should document what this does -- 2.39.5