1 /* Set the FPU control word for x86. 2 Copyright (C) 2003-2021 Free Software Foundation, Inc. 3 This file is part of the GNU C Library. 4 5 The GNU C Library is free software; you can redistribute it and/or 6 modify it under the terms of the GNU Lesser General Public 7 License as published by the Free Software Foundation; either 8 version 2.1 of the License, or (at your option) any later version. 9 10 The GNU C Library is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 Lesser General Public License for more details. 14 15 You should have received a copy of the GNU Lesser General Public 16 License along with the GNU C Library; if not, see 17 <https://www.gnu.org/licenses/>. */ 18 19 #include <math.h> 20 #include <fpu_control.h> 21 #include <fenv.h> 22 #include <unistd.h> 23 #include <ldsodefs.h> 24 #include <dl-procinfo.h> 25 26 void __setfpucw(fpu_control_t set)27__setfpucw (fpu_control_t set) 28 { 29 fpu_control_t cw; 30 31 /* Fetch the current control word. */ 32 __asm__ ("fnstcw %0" : "=m" (*&cw)); 33 34 /* Preserve the reserved bits, and set the rest as the user 35 specified (or the default, if the user gave zero). */ 36 cw &= _FPU_RESERVED; 37 cw |= set & ~_FPU_RESERVED; 38 39 __asm__ ("fldcw %0" : : "m" (*&cw)); 40 41 /* If the CPU supports SSE, we set the MXCSR as well. */ 42 if (CPU_FEATURE_USABLE (SSE)) 43 { 44 unsigned int xnew_exc; 45 46 /* Get the current MXCSR. */ 47 __asm__ ("stmxcsr %0" : "=m" (*&xnew_exc)); 48 49 xnew_exc &= ~((0xc00 << 3) | (FE_ALL_EXCEPT << 7)); 50 xnew_exc |= ((set & 0xc00) << 3) | ((set & FE_ALL_EXCEPT) << 7); 51 52 __asm__ ("ldmxcsr %0" : : "m" (*&xnew_exc)); 53 } 54 } 55