1 1.5.4.1 yamt /* $NetBSD: fpsetmask.c,v 1.5.4.1 2012/04/17 00:05:15 yamt Exp $ */ 2 1.1 eeh 3 1.1 eeh /* 4 1.1 eeh * Written by J.T. Conklin, Apr 10, 1995 5 1.1 eeh * Public domain. 6 1.1 eeh */ 7 1.1 eeh 8 1.2 thorpej #include <sys/cdefs.h> 9 1.3 lukem #if defined(LIBC_SCCS) && !defined(lint) 10 1.5.4.1 yamt __RCSID("$NetBSD: fpsetmask.c,v 1.5.4.1 2012/04/17 00:05:15 yamt Exp $"); 11 1.3 lukem #endif /* LIBC_SCCS and not lint */ 12 1.2 thorpej 13 1.2 thorpej #include "namespace.h" 14 1.2 thorpej 15 1.5.4.1 yamt #include <sys/types.h> 16 1.1 eeh #include <ieeefp.h> 17 1.2 thorpej 18 1.2 thorpej #ifdef __weak_alias 19 1.2 thorpej __weak_alias(fpsetmask,_fpsetmask) 20 1.2 thorpej #endif 21 1.1 eeh 22 1.5 martin #ifdef EXCEPTIONS_WITH_SOFTFLOAT 23 1.5 martin extern fp_except _softfloat_float_exception_mask; 24 1.5 martin #endif 25 1.5 martin 26 1.1 eeh fp_except 27 1.1 eeh fpsetmask(mask) 28 1.1 eeh fp_except mask; 29 1.1 eeh { 30 1.1 eeh fp_except old; 31 1.1 eeh fp_except new; 32 1.1 eeh 33 1.4 perry __asm("st %%fsr,%0" : "=m" (*&old)); 34 1.1 eeh 35 1.1 eeh new = old; 36 1.1 eeh new &= ~(0x1f << 23); 37 1.1 eeh new |= ((mask & 0x1f) << 23); 38 1.1 eeh 39 1.4 perry __asm("ld %0,%%fsr" : : "m" (*&new)); 40 1.1 eeh 41 1.5.4.1 yamt old = ((uint32_t)old >> 23) & 0x1f; 42 1.5 martin 43 1.5 martin #ifdef EXCEPTIONS_WITH_SOFTFLOAT 44 1.5 martin /* update softfloat mask as well */ 45 1.5 martin old |= _softfloat_float_exception_mask; 46 1.5 martin _softfloat_float_exception_mask = mask; 47 1.5 martin #endif 48 1.5 martin 49 1.5 martin return old; 50 1.1 eeh } 51