1 /** 2 * This file has no copyright assigned and is placed in the Public Domain. 3 * This file is part of the mingw-w64 runtime package. 4 * No warranty is given; refer to the file DISCLAIMER.PD within this package. 5 */ 6 #include <fenv.h> 7 8 #if !(defined(_ARM_) || defined(__arm__) || defined(_ARM64_) || defined(__aarch64__)) 9 int __mingw_has_sse (void); 10 #endif /* !(defined(_ARM_) || defined(__arm__) || defined(_ARM64_) || defined(__aarch64__)) */ 11 12 /* 7.6.4.1 13 The fegetenv function stores the current floating-point environment 14 in the object pointed to by envp. */ 15 fegetenv(fenv_t * envp)16int fegetenv (fenv_t * envp) 17 { 18 #if defined(_ARM_) || defined(__arm__) 19 __asm__ volatile ("fmrx %0, FPSCR" : "=r" (*envp)); 20 #elif defined(_ARM64_) || defined(__aarch64__) 21 unsigned __int64 fpcr; 22 __asm__ volatile ("mrs %0, fpcr" : "=r" (fpcr)); 23 envp->__cw = fpcr; 24 #else 25 __asm__ __volatile__ ("fnstenv %0;": "=m" (*envp)); 26 /* fnstenv sets control word to non-stop for all exceptions, so we 27 need to reload our env to restore the original mask. */ 28 __asm__ __volatile__ ("fldenv %0" : : "m" (*envp)); 29 if (__mingw_has_sse ()) 30 { 31 int _mxcsr; 32 __asm__ __volatile__ ("stmxcsr %0" : "=m" (_mxcsr)); 33 envp->__unused0 = (((unsigned int) _mxcsr) >> 16); 34 envp->__unused1 = (((unsigned int) _mxcsr) & 0xffff); 35 } 36 #endif /* defined(_ARM_) || defined(__arm__) || defined(_ARM64_) || defined(__aarch64__) */ 37 return 0; 38 } 39 40