![]() |
Public API Reference |
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(PROC_X86) && defined(COMP_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(COMP_VC)
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__