1 /* 2 * Copyright 2013, The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifdef __ARM_ARCH_7A__ 18 19 #include <portability.h> 20 #include <fenv.h> 21 #include <fenv_portable.h> 22 23 int WRAP(fegetenv)(fenv_t* __envp) { 24 fenv_t _fpscr; 25 __asm__ __volatile__("vmrs %0,fpscr" : "=r" (_fpscr)); 26 *__envp = _fpscr; 27 return 0; 28 } 29 30 int WRAP(fesetenv)(const fenv_t* __envp) { 31 fenv_t _fpscr = *__envp; 32 __asm__ __volatile__("vmsr fpscr,%0" : :"ri" (_fpscr)); 33 return 0; 34 } 35 36 int WRAP(feclearexcept)(int __excepts) { 37 fexcept_t __fpscr; 38 WRAP(fegetenv)(&__fpscr); 39 __fpscr &= ~__excepts; 40 WRAP(fesetenv)(&__fpscr); 41 return 0; 42 } 43 44 int WRAP(fegetexceptflag)(fexcept_t* __flagp, int __excepts) { 45 fexcept_t __fpscr; 46 WRAP(fegetenv)(&__fpscr); 47 *__flagp = __fpscr & __excepts; 48 return 0; 49 } 50 51 int WRAP(fesetexceptflag)(const fexcept_t* __flagp, int __excepts) { 52 fexcept_t __fpscr; 53 WRAP(fegetenv)(&__fpscr); 54 __fpscr &= ~__excepts; 55 __fpscr |= *__flagp & __excepts; 56 WRAP(fesetenv)(&__fpscr); 57 return 0; 58 } 59 60 int WRAP(feraiseexcept)(int __excepts) { 61 fexcept_t __ex = __excepts; 62 WRAP(fesetexceptflag)(&__ex, __excepts); 63 return 0; 64 } 65 66 int WRAP(fetestexcept)(int __excepts) { 67 fexcept_t __fpscr; 68 WRAP(fegetenv)(&__fpscr); 69 return (__fpscr & __excepts); 70 } 71 72 int WRAP(fegetround)(void) { 73 fenv_t _fpscr; 74 WRAP(fegetenv)(&_fpscr); 75 return ((_fpscr >> _FPSCR_RMODE_SHIFT) & 0x3); 76 } 77 78 int WRAP(fesetround)(int __round) { 79 fenv_t _fpscr; 80 WRAP(fegetenv)(&_fpscr); 81 _fpscr &= ~(0x3 << _FPSCR_RMODE_SHIFT); 82 _fpscr |= (__round << _FPSCR_RMODE_SHIFT); 83 WRAP(fesetenv)(&_fpscr); 84 return 0; 85 } 86 87 int WRAP(feholdexcept)(fenv_t* __envp) { 88 fenv_t __env; 89 WRAP(fegetenv)(&__env); 90 *__envp = __env; 91 __env &= ~(FE_ALL_EXCEPT | _FPSCR_ENABLE_MASK); 92 WRAP(fesetenv)(&__env); 93 return 0; 94 } 95 96 int WRAP(feupdateenv)(const fenv_t* __envp) { 97 fexcept_t __fpscr; 98 WRAP(fegetenv)(&__fpscr); 99 WRAP(fesetenv)(__envp); 100 WRAP(feraiseexcept)(__fpscr & FE_ALL_EXCEPT); 101 return 0; 102 } 103 104 #endif /* __ARM_ARCH_7A__ */ 105