CrystalSpace

Public API Reference

csutil/fpu80x86.h

00001 /*
00002     Copyright (C) 1998 by Jorrit Tyberghein
00003   
00004     This library is free software; you can redistribute it and/or
00005     modify it under the terms of the GNU Library General Public
00006     License as published by the Free Software Foundation; either
00007     version 2 of the License, or (at your option) any later version.
00008   
00009     This library is distributed in the hope that it will be useful,
00010     but WITHOUT ANY WARRANTY; without even the implied warranty of
00011     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012     Library General Public License for more details.
00013   
00014     You should have received a copy of the GNU Library General Public
00015     License along with this library; if not, write to the Free
00016     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
00017 */
00018 
00019 #ifndef __CS_FPU80X86_H__
00020 #define __CS_FPU80X86_H__
00021 
00022 #if defined(CS_PROCESSOR_X86) && defined(CS_COMPILER_GCC)
00023 
00024 /*
00025      ---- ---- --XX XXXX = MCW_EM - exception masks (1=handle exception internally, 0=fault)
00026      ---- ---- ---- ---X = EM_INVALID - invalid operation
00027      ---- ---- ---- --X- = EM_DENORMAL - denormal operand
00028      ---- ---- ---- -X-- = EM_ZERODIVIDE - divide by zero
00029      ---- ---- ---- X--- = EM_OVERFLOW - overflow
00030      ---- ---- ---X ---- = EM_UNDERFLOW - underflow
00031      ---- ---- --X- ---- = EM_INEXACT - rounding was required
00032      ---- --XX ---- ---- = MCW_PC - precision control
00033      ---- --00 ---- ---- = PC_24 - single precision
00034      ---- --10 ---- ---- = PC_53 - double precision
00035      ---- --11 ---- ---- = PC_64 - extended precision
00036      ---- XX-- ---- ---- = MCW_RC - rounding control
00037      ---- 00-- ---- ---- = RC_NEAR - round to nearest
00038      ---- 01-- ---- ---- = RC_DOWN - round towards -Inf
00039      ---- 10-- ---- ---- = RC_UP - round towards +Inf
00040      ---- 11-- ---- ---- = RC_CHOP - round towards zero
00041      ---X ---- ---- ---- = MCW_IC - infinity control (obsolete, always affine)
00042      ---0 ---- ---- ---- = IC_AFFINE - -Inf < +Inf
00043      ---1 ---- ---- ---- = IC_PROJECTIVE - -Inf == +Inf
00044 */
00045 
00046 static inline unsigned int csControl87(unsigned int newcw, unsigned int mask)
00047 {
00048   int oldcw;
00049   asm __volatile__
00050   (
00051         "       fclex                   \n"     // clear exceptions
00052         "       fstcw   %3              \n"     // oldcw = FPU control word
00053         "       andl    %3,%%eax        \n"     // eax &= oldcw;
00054         "       andl    %0,%%ecx        \n"     // ecx &= newcw
00055         "       orl     %%ecx,%%eax     \n"     // eax |= ecx
00056         "       movl    %%eax,%3        \n"     // tmpcw = ebx
00057         "       fldcw   %3              \n"     // load FPU control word
00058         :
00059         : "g" (newcw), "a" (~mask), "c" (mask), "m" (oldcw)
00060         : "memory"
00061   );
00062   // NOTE: oldcw is modified by the asm.  workaround for gcc 3.0
00063   return oldcw & 0xffff;
00064 }
00065 
00066 
00067 #else
00068 
00069 #if defined(CS_COMPILER_MSVC)
00070 #define csControl87     _control87
00071 #else
00072 static inline unsigned int csControl87(unsigned int, unsigned int) { return 0; }
00073 #endif
00074 
00075 #endif
00076 
00077 #endif // __CS_FPU80X86_H__

Generated for Crystal Space by doxygen 1.4.7