Disabled external gits
This commit is contained in:
		
							
								
								
									
										24
									
								
								cs440-acg/ext/openexr/IlmBase/IexMath/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								cs440-acg/ext/openexr/IlmBase/IexMath/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,24 @@
 | 
			
		||||
# pstanczyk@ilm.com
 | 
			
		||||
 | 
			
		||||
IF(ILMBASE_BUILD_SHARED_LIBS)
 | 
			
		||||
    ADD_DEFINITIONS(-DIEXMATH_EXPORTS)
 | 
			
		||||
ENDIF()
 | 
			
		||||
ADD_LIBRARY ( IexMath ${LIB_TYPE}
 | 
			
		||||
  IexMathFloatExc.cpp  
 | 
			
		||||
  IexMathFpu.cpp
 | 
			
		||||
  )
 | 
			
		||||
TARGET_LINK_LIBRARIES(IexMath Iex)
 | 
			
		||||
 | 
			
		||||
INSTALL ( TARGETS
 | 
			
		||||
  IexMath
 | 
			
		||||
  DESTINATION
 | 
			
		||||
  ${OPENEXR_INSTALL_LIB_DEST}
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
INSTALL ( FILES 
 | 
			
		||||
  IexMathFloatExc.h  
 | 
			
		||||
  IexMathFpu.h  
 | 
			
		||||
  IexMathIeeeExc.h
 | 
			
		||||
  DESTINATION
 | 
			
		||||
  ${OPENEXR_INSTALL_HEADER_DEST}
 | 
			
		||||
)
 | 
			
		||||
							
								
								
									
										113
									
								
								cs440-acg/ext/openexr/IlmBase/IexMath/IexMathFloatExc.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										113
									
								
								cs440-acg/ext/openexr/IlmBase/IexMath/IexMathFloatExc.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,113 @@
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
//
 | 
			
		||||
// Copyright (c) 1997-2012, Industrial Light & Magic, a division of Lucas
 | 
			
		||||
// Digital Ltd. LLC
 | 
			
		||||
//
 | 
			
		||||
// All rights reserved.
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
// *       Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
// *       Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
// *       Neither the name of Industrial Light & Magic nor the names of
 | 
			
		||||
// its contributors may be used to endorse or promote products derived
 | 
			
		||||
// from this software without specific prior written permission.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
//
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------
 | 
			
		||||
//
 | 
			
		||||
//	A function to control which IEEE floating
 | 
			
		||||
//	point exceptions will be translated into
 | 
			
		||||
//	C++ MathExc exceptions.
 | 
			
		||||
//
 | 
			
		||||
//-----------------------------------------------------
 | 
			
		||||
 | 
			
		||||
#include <IexMathFloatExc.h>
 | 
			
		||||
#include <IexMacros.h>
 | 
			
		||||
#include <IexMathFpu.h>
 | 
			
		||||
 | 
			
		||||
#if 0
 | 
			
		||||
    #include <iostream>
 | 
			
		||||
    #define debug(x) (std::cout << x << std::flush)
 | 
			
		||||
#else
 | 
			
		||||
    #define debug(x)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
IEX_INTERNAL_NAMESPACE_SOURCE_ENTER
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
namespace {
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
fpeHandler (int type, const char explanation[])
 | 
			
		||||
{
 | 
			
		||||
    switch (type)
 | 
			
		||||
    {
 | 
			
		||||
      case IEEE_OVERFLOW:
 | 
			
		||||
	throw OverflowExc (explanation);
 | 
			
		||||
 | 
			
		||||
      case IEEE_UNDERFLOW:
 | 
			
		||||
	throw UnderflowExc (explanation);
 | 
			
		||||
 | 
			
		||||
      case IEEE_DIVZERO:
 | 
			
		||||
	throw DivzeroExc (explanation);
 | 
			
		||||
 | 
			
		||||
      case IEEE_INEXACT:
 | 
			
		||||
	throw InexactExc (explanation);
 | 
			
		||||
 | 
			
		||||
      case IEEE_INVALID:
 | 
			
		||||
	throw InvalidFpOpExc (explanation);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    throw MathExc (explanation);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
mathExcOn (int when)
 | 
			
		||||
{
 | 
			
		||||
    debug ("mathExcOn (when = 0x" << std::hex << when << ")\n");
 | 
			
		||||
 | 
			
		||||
    setFpExceptions (when);
 | 
			
		||||
    setFpExceptionHandler (fpeHandler);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
getMathExcOn ()
 | 
			
		||||
{
 | 
			
		||||
    int when = fpExceptions();
 | 
			
		||||
 | 
			
		||||
    debug ("getMathExcOn () == 0x" << std::hex << when << ")\n");
 | 
			
		||||
 | 
			
		||||
    return when;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
MathExcOn::handleOutstandingExceptions()
 | 
			
		||||
{
 | 
			
		||||
    handleExceptionsSetInRegisters();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
IEX_INTERNAL_NAMESPACE_SOURCE_EXIT
 | 
			
		||||
							
								
								
									
										146
									
								
								cs440-acg/ext/openexr/IlmBase/IexMath/IexMathFloatExc.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										146
									
								
								cs440-acg/ext/openexr/IlmBase/IexMath/IexMathFloatExc.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,146 @@
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
//
 | 
			
		||||
// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas
 | 
			
		||||
// Digital Ltd. LLC
 | 
			
		||||
// 
 | 
			
		||||
// All rights reserved.
 | 
			
		||||
// 
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
// *       Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
// *       Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
// *       Neither the name of Industrial Light & Magic nor the names of
 | 
			
		||||
// its contributors may be used to endorse or promote products derived
 | 
			
		||||
// from this software without specific prior written permission. 
 | 
			
		||||
// 
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
//
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifndef INCLUDED_IEXMATHFLOATEXC_H
 | 
			
		||||
#define INCLUDED_IEXMATHFLOATEXC_H
 | 
			
		||||
 | 
			
		||||
#ifndef IEXMATH_EXPORT_H
 | 
			
		||||
#define IEXMATH_EXPORT_H
 | 
			
		||||
 | 
			
		||||
#if defined(OPENEXR_DLL)
 | 
			
		||||
    #if defined(IEXMATH_EXPORTS)
 | 
			
		||||
    #define IEXMATH_EXPORT __declspec(dllexport)
 | 
			
		||||
    #else
 | 
			
		||||
    #define IEXMATH_EXPORT __declspec(dllimport)
 | 
			
		||||
    #endif
 | 
			
		||||
    #define IEXMATH_EXPORT_CONST
 | 
			
		||||
#else
 | 
			
		||||
    #define IEXMATH_EXPORT
 | 
			
		||||
    #define IEXMATH_EXPORT_CONST const
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "IexNamespace.h"
 | 
			
		||||
#include "IexMathExc.h"
 | 
			
		||||
//#include <IexBaseExc.h>
 | 
			
		||||
#include "IexMathIeeeExc.h"
 | 
			
		||||
 | 
			
		||||
IEX_INTERNAL_NAMESPACE_HEADER_ENTER
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-------------------------------------------------------------
 | 
			
		||||
// Function mathExcOn() defines which floating point exceptions
 | 
			
		||||
// will be trapped and converted to C++ exceptions.
 | 
			
		||||
//-------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
IEXMATH_EXPORT
 | 
			
		||||
void mathExcOn (int when = (IEEE_OVERFLOW | IEEE_DIVZERO | IEEE_INVALID));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//----------------------------------------------------------------------
 | 
			
		||||
// Function getMathExcOn() tells you for which floating point exceptions
 | 
			
		||||
// trapping and conversion to C++ exceptions is currently enabled.
 | 
			
		||||
//----------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
IEXMATH_EXPORT
 | 
			
		||||
int getMathExcOn();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//------------------------------------------------------------------------
 | 
			
		||||
// A classs that temporarily sets floating point exception trapping
 | 
			
		||||
// and conversion, and later restores the previous settings.
 | 
			
		||||
//
 | 
			
		||||
// Example:
 | 
			
		||||
//
 | 
			
		||||
//	float
 | 
			
		||||
//	trickyComputation (float x)
 | 
			
		||||
//	{
 | 
			
		||||
//	    MathExcOn meo (0);		// temporarily disable floating
 | 
			
		||||
//	    				// point exception trapping
 | 
			
		||||
//
 | 
			
		||||
//	    float result = ...;		// computation which may cause
 | 
			
		||||
//	    				// floating point exceptions
 | 
			
		||||
//
 | 
			
		||||
//	    return result;		// destruction of meo restores
 | 
			
		||||
//	}				// the program's previous floating
 | 
			
		||||
//					// point exception settings
 | 
			
		||||
//------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
class IEXMATH_EXPORT MathExcOn
 | 
			
		||||
{
 | 
			
		||||
  public:
 | 
			
		||||
 | 
			
		||||
    MathExcOn (int when)
 | 
			
		||||
	:
 | 
			
		||||
	_changed (false)
 | 
			
		||||
    {
 | 
			
		||||
	_saved = getMathExcOn(); 
 | 
			
		||||
 | 
			
		||||
	if (_saved != when)
 | 
			
		||||
	{
 | 
			
		||||
	    _changed = true;
 | 
			
		||||
	    mathExcOn (when);
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ~MathExcOn ()
 | 
			
		||||
    {
 | 
			
		||||
	if (_changed)
 | 
			
		||||
	    mathExcOn (_saved);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // It is possible for functions to set the exception registers
 | 
			
		||||
    // yet not trigger a SIGFPE.  Specifically, the implementation
 | 
			
		||||
    // of pow(x, y) we're using can generates a NaN from a negative x
 | 
			
		||||
    // and fractional y but a SIGFPE is not generated.
 | 
			
		||||
    // This function examimes the exception registers and calls the
 | 
			
		||||
    // fpHandler if those registers modulo the exception mask are set.
 | 
			
		||||
    // It should be called wherever this class is commonly used where it has
 | 
			
		||||
    // been found that certain floating point exceptions are not being thrown.
 | 
			
		||||
 | 
			
		||||
    void handleOutstandingExceptions();
 | 
			
		||||
 | 
			
		||||
  private:
 | 
			
		||||
 | 
			
		||||
    bool                        _changed;
 | 
			
		||||
    int				_saved;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
IEX_INTERNAL_NAMESPACE_HEADER_EXIT
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										530
									
								
								cs440-acg/ext/openexr/IlmBase/IexMath/IexMathFpu.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										530
									
								
								cs440-acg/ext/openexr/IlmBase/IexMath/IexMathFpu.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,530 @@
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
//
 | 
			
		||||
// Copyright (c) 1997, Industrial Light & Magic, a division of Lucas
 | 
			
		||||
// Digital Ltd. LLC
 | 
			
		||||
// 
 | 
			
		||||
// All rights reserved.
 | 
			
		||||
// 
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
// *       Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
// *       Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
// *       Neither the name of Industrial Light & Magic nor the names of
 | 
			
		||||
// its contributors may be used to endorse or promote products derived
 | 
			
		||||
// from this software without specific prior written permission. 
 | 
			
		||||
// 
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
//
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//------------------------------------------------------------------------
 | 
			
		||||
//
 | 
			
		||||
//	Functions to control floating point exceptions.
 | 
			
		||||
//
 | 
			
		||||
//------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
#include "IexMathFpu.h"
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <IlmBaseConfig.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
 | 
			
		||||
#if 0
 | 
			
		||||
    #include <iostream>
 | 
			
		||||
    #define debug(x) (std::cout << x << std::flush)
 | 
			
		||||
#else
 | 
			
		||||
    #define debug(x)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(HAVE_UCONTEXT_H) && (defined(__x86_64__) || defined(_M_X64) || defined(__i386__) || defined(_M_IX86))
 | 
			
		||||
 | 
			
		||||
#include <ucontext.h>
 | 
			
		||||
#include <signal.h>
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
IEX_INTERNAL_NAMESPACE_SOURCE_ENTER
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
namespace FpuControl
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
//-------------------------------------------------------------------
 | 
			
		||||
//
 | 
			
		||||
//    Modern x86 processors and all AMD64 processors have two
 | 
			
		||||
//    sets of floating-point control/status registers: cw and sw
 | 
			
		||||
//    for legacy x87 stack-based arithmetic, and mxcsr for
 | 
			
		||||
//    SIMD arithmetic.  When setting exception masks or checking
 | 
			
		||||
//    for exceptions, we must set/check all relevant registers,
 | 
			
		||||
//    since applications may contain code that uses either FP
 | 
			
		||||
//    model.
 | 
			
		||||
//
 | 
			
		||||
//    These functions handle both FP models for x86 and AMD64.
 | 
			
		||||
//
 | 
			
		||||
//-------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
//-------------------------------------------------------------------
 | 
			
		||||
//
 | 
			
		||||
//    Restore the control register state from a signal handler
 | 
			
		||||
//    user context, optionally clearing the exception bits
 | 
			
		||||
//    in the restored control register, if applicable.
 | 
			
		||||
//
 | 
			
		||||
//-------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
void restoreControlRegs (const ucontext_t & ucon,
 | 
			
		||||
			 bool clearExceptions = false);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//------------------------------------------------------------
 | 
			
		||||
//
 | 
			
		||||
//    Set exception mask bits in the control register state.
 | 
			
		||||
//    A value of 1 means the exception is masked, a value of
 | 
			
		||||
//    0 means the exception is enabled.
 | 
			
		||||
//
 | 
			
		||||
//    setExceptionMask returns the previous mask value.  If
 | 
			
		||||
//    the 'exceptions' pointer is non-null, it returns in 
 | 
			
		||||
//    this argument the FPU exception bits.
 | 
			
		||||
//
 | 
			
		||||
//------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
const int INVALID_EXC   = (1<<0);
 | 
			
		||||
const int DENORMAL_EXC  = (1<<1);
 | 
			
		||||
const int DIVZERO_EXC   = (1<<2);
 | 
			
		||||
const int OVERFLOW_EXC  = (1<<3);
 | 
			
		||||
const int UNDERFLOW_EXC = (1<<4);
 | 
			
		||||
const int INEXACT_EXC   = (1<<5);
 | 
			
		||||
const int ALL_EXC       = INVALID_EXC  | DENORMAL_EXC  | DIVZERO_EXC |
 | 
			
		||||
                          OVERFLOW_EXC | UNDERFLOW_EXC | INEXACT_EXC;
 | 
			
		||||
 | 
			
		||||
int setExceptionMask (int mask, int * exceptions = 0);
 | 
			
		||||
int getExceptionMask ();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//---------------------------------------------
 | 
			
		||||
//
 | 
			
		||||
//    Get/clear the exception bits in the FPU.
 | 
			
		||||
//
 | 
			
		||||
//---------------------------------------------
 | 
			
		||||
 | 
			
		||||
int  getExceptions ();
 | 
			
		||||
void clearExceptions ();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//------------------------------------------------------------------
 | 
			
		||||
//
 | 
			
		||||
//    Everything below here is implementation.  Do not use these
 | 
			
		||||
//    constants or functions in your applications or libraries.
 | 
			
		||||
//    This is not the code you're looking for.  Move along.
 | 
			
		||||
//
 | 
			
		||||
//    Optimization notes -- on a Pentium 4, at least, it appears
 | 
			
		||||
//    to be faster to get the mxcsr first and then the cw; and to
 | 
			
		||||
//    set the cw first and then the mxcsr.  Also, it seems to
 | 
			
		||||
//    be faster to clear the sw exception bits after setting
 | 
			
		||||
//    cw and mxcsr.
 | 
			
		||||
//
 | 
			
		||||
//------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
static inline uint16_t
 | 
			
		||||
getSw ()
 | 
			
		||||
{
 | 
			
		||||
    uint16_t sw;
 | 
			
		||||
    asm volatile ("fnstsw %0" : "=m" (sw) : );
 | 
			
		||||
    return sw;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void
 | 
			
		||||
setCw (uint16_t cw)
 | 
			
		||||
{
 | 
			
		||||
    asm volatile ("fldcw %0" : : "m" (cw) );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline uint16_t
 | 
			
		||||
getCw ()
 | 
			
		||||
{
 | 
			
		||||
    uint16_t cw;
 | 
			
		||||
    asm volatile ("fnstcw %0" : "=m" (cw) : );
 | 
			
		||||
    return cw;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void
 | 
			
		||||
setMxcsr (uint32_t mxcsr, bool clearExceptions)
 | 
			
		||||
{
 | 
			
		||||
    mxcsr &= clearExceptions ? 0xffffffc0 : 0xffffffff;
 | 
			
		||||
    asm volatile ("ldmxcsr %0" : : "m" (mxcsr) );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline uint32_t
 | 
			
		||||
getMxcsr ()
 | 
			
		||||
{
 | 
			
		||||
    uint32_t mxcsr;
 | 
			
		||||
    asm volatile ("stmxcsr %0" : "=m" (mxcsr) : );
 | 
			
		||||
    return mxcsr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline int
 | 
			
		||||
calcMask (uint16_t cw, uint32_t mxcsr)
 | 
			
		||||
{
 | 
			
		||||
    //
 | 
			
		||||
    // Hopefully, if the user has been using FpuControl functions,
 | 
			
		||||
    // the masks are the same, but just in case they're not, we
 | 
			
		||||
    // AND them together to report the proper subset of the masks.
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    return (cw & ALL_EXC) & ((mxcsr >> 7) & ALL_EXC);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline int
 | 
			
		||||
setExceptionMask (int mask, int * exceptions)
 | 
			
		||||
{
 | 
			
		||||
    uint16_t cw = getCw ();
 | 
			
		||||
    uint32_t mxcsr = getMxcsr ();
 | 
			
		||||
    
 | 
			
		||||
    if (exceptions)
 | 
			
		||||
	*exceptions = (mxcsr & ALL_EXC) | (getSw () & ALL_EXC);
 | 
			
		||||
 | 
			
		||||
    int oldmask = calcMask (cw, mxcsr);
 | 
			
		||||
 | 
			
		||||
    //
 | 
			
		||||
    // The exception constants are chosen very carefully so that
 | 
			
		||||
    // we can do a simple mask and shift operation to insert
 | 
			
		||||
    // them into the control words.  The mask operation is for 
 | 
			
		||||
    // safety, in case the user accidentally set some other
 | 
			
		||||
    // bits in the exception mask.
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    mask &= ALL_EXC;
 | 
			
		||||
    cw = (cw & ~ALL_EXC) | mask;
 | 
			
		||||
    mxcsr = (mxcsr & ~(ALL_EXC << 7)) | (mask << 7);
 | 
			
		||||
 | 
			
		||||
    setCw (cw);
 | 
			
		||||
    setMxcsr (mxcsr, false);
 | 
			
		||||
 | 
			
		||||
    return oldmask;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline int
 | 
			
		||||
getExceptionMask ()
 | 
			
		||||
{
 | 
			
		||||
    uint32_t mxcsr = getMxcsr ();
 | 
			
		||||
    uint16_t cw = getCw ();
 | 
			
		||||
    return calcMask (cw, mxcsr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline int
 | 
			
		||||
getExceptions ()
 | 
			
		||||
{
 | 
			
		||||
    return (getMxcsr () | getSw ()) & ALL_EXC;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clearExceptions ()
 | 
			
		||||
{
 | 
			
		||||
    uint32_t mxcsr = getMxcsr () & 0xffffffc0;
 | 
			
		||||
    asm volatile ("ldmxcsr %0\n"
 | 
			
		||||
		  "fnclex"
 | 
			
		||||
		  : : "m" (mxcsr) );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// If the fpe was taken while doing a float-to-int cast using the x87,
 | 
			
		||||
// the rounding mode and possibly the precision will be wrong.  So instead
 | 
			
		||||
// of restoring to the state as of the fault, we force the rounding mode
 | 
			
		||||
// to be 'nearest' and the precision to be double extended.
 | 
			
		||||
//
 | 
			
		||||
// rounding mode is in bits 10-11, value 00 == round to nearest
 | 
			
		||||
// precision is in bits 8-9, value 11 == double extended (80-bit)
 | 
			
		||||
//
 | 
			
		||||
const uint16_t cwRestoreMask = ~((3 << 10) | (3 << 8));
 | 
			
		||||
const uint16_t cwRestoreVal = (0 << 10) | (3 << 8);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef ILMBASE_HAVE_CONTROL_REGISTER_SUPPORT
 | 
			
		||||
 | 
			
		||||
inline void
 | 
			
		||||
restoreControlRegs (const ucontext_t & ucon, bool clearExceptions)
 | 
			
		||||
{
 | 
			
		||||
    setCw ((ucon.uc_mcontext.fpregs->cwd & cwRestoreMask) | cwRestoreVal);
 | 
			
		||||
    setMxcsr (ucon.uc_mcontext.fpregs->mxcsr, clearExceptions);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
// Ugly, the mxcsr isn't defined in GNU libc ucontext_t, but
 | 
			
		||||
// it's passed to the signal handler by the kernel.  Use
 | 
			
		||||
// the kernel's version of the ucontext to get it, see
 | 
			
		||||
// <asm/sigcontext.h>
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <asm/sigcontext.h>
 | 
			
		||||
 | 
			
		||||
inline void
 | 
			
		||||
restoreControlRegs (const ucontext_t & ucon, bool clearExceptions)
 | 
			
		||||
{
 | 
			
		||||
    setCw ((ucon.uc_mcontext.fpregs->cw & cwRestoreMask) | cwRestoreVal);
 | 
			
		||||
    
 | 
			
		||||
    _fpstate * kfp = reinterpret_cast<_fpstate *> (ucon.uc_mcontext.fpregs);
 | 
			
		||||
    setMxcsr (kfp->magic == 0 ? kfp->mxcsr : 0, clearExceptions);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
} // namespace FpuControl
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
namespace {
 | 
			
		||||
 | 
			
		||||
volatile FpExceptionHandler fpeHandler = 0;
 | 
			
		||||
 | 
			
		||||
extern "C" void
 | 
			
		||||
catchSigFpe (int sig, siginfo_t *info, ucontext_t *ucon)
 | 
			
		||||
{
 | 
			
		||||
    debug ("catchSigFpe (sig = "<< sig << ", ...)\n");
 | 
			
		||||
 | 
			
		||||
    FpuControl::restoreControlRegs (*ucon, true);
 | 
			
		||||
 | 
			
		||||
    if (fpeHandler == 0)
 | 
			
		||||
	return;
 | 
			
		||||
 | 
			
		||||
    if (info->si_code == SI_USER)
 | 
			
		||||
    {
 | 
			
		||||
	fpeHandler (0, "Floating-point exception, caused by "
 | 
			
		||||
		       "a signal sent from another process.");
 | 
			
		||||
	return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (sig == SIGFPE)
 | 
			
		||||
    {
 | 
			
		||||
	switch (info->si_code)
 | 
			
		||||
	{
 | 
			
		||||
	  //
 | 
			
		||||
	  // IEEE 754 floating point exceptions:
 | 
			
		||||
	  //
 | 
			
		||||
 | 
			
		||||
	  case FPE_FLTDIV:
 | 
			
		||||
	    fpeHandler (IEEE_DIVZERO, "Floating-point division by zero.");
 | 
			
		||||
	    return;
 | 
			
		||||
 | 
			
		||||
	  case FPE_FLTOVF:
 | 
			
		||||
	    fpeHandler (IEEE_OVERFLOW, "Floating-point overflow.");
 | 
			
		||||
	    return;
 | 
			
		||||
 | 
			
		||||
	  case FPE_FLTUND:
 | 
			
		||||
	    fpeHandler (IEEE_UNDERFLOW, "Floating-point underflow.");
 | 
			
		||||
	    return;
 | 
			
		||||
 | 
			
		||||
	  case FPE_FLTRES:
 | 
			
		||||
	    fpeHandler (IEEE_INEXACT, "Inexact floating-point result.");
 | 
			
		||||
	    return;
 | 
			
		||||
 | 
			
		||||
	  case FPE_FLTINV:
 | 
			
		||||
	    fpeHandler (IEEE_INVALID, "Invalid floating-point operation.");
 | 
			
		||||
	    return;
 | 
			
		||||
 | 
			
		||||
	  //
 | 
			
		||||
	  // Other arithmetic exceptions which can also
 | 
			
		||||
	  // be trapped by the operating system:
 | 
			
		||||
	  //
 | 
			
		||||
 | 
			
		||||
	  case FPE_INTDIV:
 | 
			
		||||
	    fpeHandler (0, "Integer division by zero.");
 | 
			
		||||
	    break;
 | 
			
		||||
 | 
			
		||||
	  case FPE_INTOVF:
 | 
			
		||||
	    fpeHandler (0, "Integer overflow.");
 | 
			
		||||
	    break;
 | 
			
		||||
 | 
			
		||||
	  case FPE_FLTSUB:
 | 
			
		||||
	    fpeHandler (0, "Subscript out of range.");
 | 
			
		||||
	    break;
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fpeHandler (0, "Floating-point exception.");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
setFpExceptions (int when)
 | 
			
		||||
{
 | 
			
		||||
    int mask = FpuControl::ALL_EXC;
 | 
			
		||||
 | 
			
		||||
    if (when & IEEE_OVERFLOW)
 | 
			
		||||
	mask &= ~FpuControl::OVERFLOW_EXC;
 | 
			
		||||
    if (when & IEEE_UNDERFLOW)
 | 
			
		||||
	mask &= ~FpuControl::UNDERFLOW_EXC;
 | 
			
		||||
    if (when & IEEE_DIVZERO)
 | 
			
		||||
	mask &= ~FpuControl::DIVZERO_EXC;
 | 
			
		||||
    if (when & IEEE_INEXACT)
 | 
			
		||||
	mask &= ~FpuControl::INEXACT_EXC;
 | 
			
		||||
    if (when & IEEE_INVALID)
 | 
			
		||||
	mask &= ~FpuControl::INVALID_EXC;
 | 
			
		||||
 | 
			
		||||
    //
 | 
			
		||||
    // The Linux kernel apparently sometimes passes
 | 
			
		||||
    // incorrect si_info to signal handlers unless
 | 
			
		||||
    // the exception flags are cleared.
 | 
			
		||||
    //
 | 
			
		||||
    // XXX is this still true on 2.4+ kernels?
 | 
			
		||||
    //
 | 
			
		||||
    
 | 
			
		||||
    FpuControl::setExceptionMask (mask);
 | 
			
		||||
    FpuControl::clearExceptions ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
fpExceptions ()
 | 
			
		||||
{
 | 
			
		||||
    int mask = FpuControl::getExceptionMask ();
 | 
			
		||||
 | 
			
		||||
    int when = 0;
 | 
			
		||||
 | 
			
		||||
    if (!(mask & FpuControl::OVERFLOW_EXC))
 | 
			
		||||
	when |= IEEE_OVERFLOW;
 | 
			
		||||
    if (!(mask & FpuControl::UNDERFLOW_EXC))
 | 
			
		||||
	when |= IEEE_UNDERFLOW;
 | 
			
		||||
    if (!(mask & FpuControl::DIVZERO_EXC))
 | 
			
		||||
	when |= IEEE_DIVZERO;
 | 
			
		||||
    if (!(mask & FpuControl::INEXACT_EXC))
 | 
			
		||||
	when |= IEEE_INEXACT;
 | 
			
		||||
    if (!(mask & FpuControl::INVALID_EXC))
 | 
			
		||||
	when |= IEEE_INVALID;
 | 
			
		||||
 | 
			
		||||
    return when;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
handleExceptionsSetInRegisters()
 | 
			
		||||
{
 | 
			
		||||
    if (fpeHandler == 0)
 | 
			
		||||
	return;
 | 
			
		||||
 | 
			
		||||
    int mask = FpuControl::getExceptionMask ();
 | 
			
		||||
 | 
			
		||||
    int exc = FpuControl::getExceptions();
 | 
			
		||||
 | 
			
		||||
    if (!(mask & FpuControl::DIVZERO_EXC) && (exc & FpuControl::DIVZERO_EXC))
 | 
			
		||||
    {
 | 
			
		||||
        fpeHandler(IEEE_DIVZERO, "Floating-point division by zero.");
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!(mask & FpuControl::OVERFLOW_EXC) && (exc & FpuControl::OVERFLOW_EXC))
 | 
			
		||||
    {
 | 
			
		||||
        fpeHandler(IEEE_OVERFLOW, "Floating-point overflow.");
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!(mask & FpuControl::UNDERFLOW_EXC) && (exc & FpuControl::UNDERFLOW_EXC))
 | 
			
		||||
    {
 | 
			
		||||
        fpeHandler(IEEE_UNDERFLOW, "Floating-point underflow.");
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!(mask & FpuControl::INEXACT_EXC) && (exc & FpuControl::INEXACT_EXC))
 | 
			
		||||
    {
 | 
			
		||||
        fpeHandler(IEEE_INEXACT, "Inexact floating-point result.");
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!(mask & FpuControl::INVALID_EXC) && (exc & FpuControl::INVALID_EXC))
 | 
			
		||||
    {
 | 
			
		||||
        fpeHandler(IEEE_INVALID, "Invalid floating-point operation.");
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
setFpExceptionHandler (FpExceptionHandler handler)
 | 
			
		||||
{
 | 
			
		||||
    if (fpeHandler == 0)
 | 
			
		||||
    {
 | 
			
		||||
	struct sigaction action;
 | 
			
		||||
	sigemptyset (&action.sa_mask);
 | 
			
		||||
	action.sa_flags = SA_SIGINFO | SA_NOMASK;
 | 
			
		||||
	action.sa_sigaction = (void (*) (int, siginfo_t *, void *)) catchSigFpe;
 | 
			
		||||
	action.sa_restorer = 0;
 | 
			
		||||
 | 
			
		||||
	sigaction (SIGFPE, &action, 0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fpeHandler = handler;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
IEX_INTERNAL_NAMESPACE_SOURCE_EXIT
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
#include <signal.h>
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
 | 
			
		||||
IEX_INTERNAL_NAMESPACE_SOURCE_ENTER
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
namespace 
 | 
			
		||||
{
 | 
			
		||||
	volatile FpExceptionHandler fpeHandler = 0;
 | 
			
		||||
	void fpExc_(int x)
 | 
			
		||||
	{
 | 
			
		||||
	    if (fpeHandler != 0)
 | 
			
		||||
	    {
 | 
			
		||||
		fpeHandler(x, "");
 | 
			
		||||
	    }
 | 
			
		||||
	    else
 | 
			
		||||
	    {
 | 
			
		||||
		assert(0 != "Floating point exception");
 | 
			
		||||
	    }
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
setFpExceptions( int )
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
setFpExceptionHandler (FpExceptionHandler handler)
 | 
			
		||||
{
 | 
			
		||||
    // improve floating point exception handling nanoscopically above "nothing at all"
 | 
			
		||||
    fpeHandler = handler;
 | 
			
		||||
    signal(SIGFPE, fpExc_);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
fpExceptions()
 | 
			
		||||
{
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
handleExceptionsSetInRegisters()
 | 
			
		||||
{
 | 
			
		||||
    // No implementation on this platform
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
IEX_INTERNAL_NAMESPACE_SOURCE_EXIT
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										91
									
								
								cs440-acg/ext/openexr/IlmBase/IexMath/IexMathFpu.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										91
									
								
								cs440-acg/ext/openexr/IlmBase/IexMath/IexMathFpu.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,91 @@
 | 
			
		||||
#ifndef INCLUDED_IEXMATHFPU_H
 | 
			
		||||
#define INCLUDED_IEXMATHFPU_H
 | 
			
		||||
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
//
 | 
			
		||||
// Copyright (c) 1997, Industrial Light & Magic, a division of Lucas
 | 
			
		||||
// Digital Ltd. LLC
 | 
			
		||||
// 
 | 
			
		||||
// All rights reserved.
 | 
			
		||||
// 
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
// *       Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
// *       Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
// *       Neither the name of Industrial Light & Magic nor the names of
 | 
			
		||||
// its contributors may be used to endorse or promote products derived
 | 
			
		||||
// from this software without specific prior written permission. 
 | 
			
		||||
// 
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
//
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//------------------------------------------------------------------------
 | 
			
		||||
//
 | 
			
		||||
//	Functions to control floating point exceptions.
 | 
			
		||||
//
 | 
			
		||||
//------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
#include "IexMathIeeeExc.h"
 | 
			
		||||
#include "IexNamespace.h"
 | 
			
		||||
 | 
			
		||||
IEX_INTERNAL_NAMESPACE_HEADER_ENTER
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------
 | 
			
		||||
// setFpExceptions() defines which floating
 | 
			
		||||
// point exceptions cause SIGFPE signals.
 | 
			
		||||
//-----------------------------------------
 | 
			
		||||
 | 
			
		||||
void setFpExceptions (int when = (IEEE_OVERFLOW | IEEE_DIVZERO | IEEE_INVALID));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//----------------------------------------
 | 
			
		||||
// fpExceptions() tells you which floating
 | 
			
		||||
// point exceptions cause SIGFPE signals.
 | 
			
		||||
//----------------------------------------
 | 
			
		||||
 | 
			
		||||
int fpExceptions ();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//------------------------------------------
 | 
			
		||||
// setFpExceptionHandler() defines a handler
 | 
			
		||||
// that will be called when SIGFPE occurs.
 | 
			
		||||
//------------------------------------------
 | 
			
		||||
 | 
			
		||||
extern "C" typedef void (* FpExceptionHandler) (int type, const char explanation[]);
 | 
			
		||||
 | 
			
		||||
void setFpExceptionHandler (FpExceptionHandler handler);
 | 
			
		||||
 | 
			
		||||
// -----------------------------------------
 | 
			
		||||
// handleExceptionsSetInRegisters() examines
 | 
			
		||||
// the exception registers and calls the
 | 
			
		||||
// floating point exception handler if the
 | 
			
		||||
// bits are set.  This function exists to 
 | 
			
		||||
// allow trapping of exception register states
 | 
			
		||||
// that can get set though no SIGFPE occurs.
 | 
			
		||||
// -----------------------------------------
 | 
			
		||||
 | 
			
		||||
void handleExceptionsSetInRegisters();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
IEX_INTERNAL_NAMESPACE_HEADER_EXIT
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										62
									
								
								cs440-acg/ext/openexr/IlmBase/IexMath/IexMathIeeeExc.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								cs440-acg/ext/openexr/IlmBase/IexMath/IexMathIeeeExc.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,62 @@
 | 
			
		||||
#ifndef INCLUDED_IEXMATHIEEE_EXC_H
 | 
			
		||||
#define INCLUDED_IEXMATHIEEE_EXC_H
 | 
			
		||||
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
//
 | 
			
		||||
// Copyright (c) 1997, Industrial Light & Magic, a division of Lucas
 | 
			
		||||
// Digital Ltd. LLC
 | 
			
		||||
// 
 | 
			
		||||
// All rights reserved.
 | 
			
		||||
// 
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
// *       Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
// *       Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
// *       Neither the name of Industrial Light & Magic nor the names of
 | 
			
		||||
// its contributors may be used to endorse or promote products derived
 | 
			
		||||
// from this software without specific prior written permission. 
 | 
			
		||||
// 
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
//
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//---------------------------------------------------------------------------
 | 
			
		||||
//
 | 
			
		||||
//	Names for the loating point exceptions defined by IEEE standard 754
 | 
			
		||||
//
 | 
			
		||||
//---------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
#include "IexNamespace.h"
 | 
			
		||||
 | 
			
		||||
IEX_INTERNAL_NAMESPACE_HEADER_ENTER
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
enum IeeeExcType
 | 
			
		||||
{
 | 
			
		||||
    IEEE_OVERFLOW  = 1,
 | 
			
		||||
    IEEE_UNDERFLOW = 2,
 | 
			
		||||
    IEEE_DIVZERO   = 4,
 | 
			
		||||
    IEEE_INEXACT   = 8,
 | 
			
		||||
    IEEE_INVALID   = 16
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
IEX_INTERNAL_NAMESPACE_HEADER_EXIT
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										20
									
								
								cs440-acg/ext/openexr/IlmBase/IexMath/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								cs440-acg/ext/openexr/IlmBase/IexMath/Makefile.am
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,20 @@
 | 
			
		||||
## Process this file with automake to produce Makefile.in
 | 
			
		||||
 | 
			
		||||
lib_LTLIBRARIES = libIexMath.la
 | 
			
		||||
 | 
			
		||||
libIexMathincludedir = $(includedir)/OpenEXR
 | 
			
		||||
 | 
			
		||||
libIexMath_la_SOURCES = IexMathFloatExc.cpp IexMathFpu.cpp
 | 
			
		||||
libIexMathinclude_HEADERS = IexMathFloatExc.h IexMathFpu.h IexMathIeeeExc.h
 | 
			
		||||
 | 
			
		||||
libIexMath_la_LDFLAGS = -version-info @LIBTOOL_VERSION@ -no-undefined
 | 
			
		||||
if LIB_SUFFIX_EXISTS
 | 
			
		||||
libIexMath_la_LDFLAGS += -release @LIB_SUFFIX@
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
libIexMath_la_LIBADD = ../Iex/libIex.la
 | 
			
		||||
 | 
			
		||||
INCLUDES = -I$(top_builddir) -I$(top_srcdir)/Iex \
 | 
			
		||||
           -I$(top_srcdir)/config
 | 
			
		||||
 | 
			
		||||
EXTRA_DIST = CMakeLists.txt
 | 
			
		||||
		Reference in New Issue
	
	Block a user