1/* Set current rounding direction. 2 Copyright (C) 1997, 2003, 2004, 2005 Free Software Foundation, Inc. 3 This file is part of the GNU C Library. 4 Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. 5 6 The GNU C Library is free software; you can redistribute it and/or 7 modify it under the terms of the GNU Lesser General Public 8 License as published by the Free Software Foundation; either 9 version 2.1 of the License, or (at your option) any later version. 10 11 The GNU C Library is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 Lesser General Public License for more details. 15 16 You should have received a copy of the GNU Lesser General Public 17 License along with the GNU C Library; if not, write to the Free 18 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 19 02111-1307 USA. */ 20 21#include <fenv.h> 22#include <unistd.h> 23 24int 25fesetround (int round) 26{ 27 unsigned short int cw; 28 29 if ((round & ~0xc00) != 0) 30 /* ROUND is no valid rounding mode. */ 31 return 1; 32 33 __asm__ ("fnstcw %0" : "=m" (*&cw)); 34 cw &= ~0xc00; 35 cw |= round; 36 __asm__ ("fldcw %0" : : "m" (*&cw)); 37 38// TODO: temporarily disabled 39#if 0 40 /* If the CPU supports SSE we set the MXCSR as well. */ 41 if ((GLRO(dl_hwcap) & HWCAP_I386_XMM) != 0) 42 { 43 unsigned int xcw; 44 45 __asm__ ("stmxcsr %0" : "=m" (*&xcw)); 46 xcw &= ~0x6000; 47 xcw |= round << 3; 48 __asm__ ("ldmxcsr %0" : : "m" (*&xcw)); 49 } 50#endif 51 52 return 0; 53} 54libm_hidden_def (fesetround) 55